Hibernate Criteria 多层次查询关联问题(转)

轉載,收藏一下!

 

http://terrencemail.javaeye.com/blog/197821

hibernate 存在如下表及关联:

Java代码 复制代码
  1. class  House{   
  2.    private  string houseid;   
  3.    private  string housename;   
  4. }   
  5. class  Shelf{   
  6.    private  string shelfid;   
  7.    private  House house;   
  8. }   
  9. class  Position{   
  10.    private  string positionid;   
  11.    private  Shelf shelf;   
  12. }   
  13. class  Warehouse{   
  14.    private  string warehouseid;   
  15.    private  Position position;   
  16. }  
class House{ private string houseid; private string housename; } class Shelf{ private string shelfid; private House house; } class Position{ private string positionid; private Shelf shelf; } class Warehouse{ private string warehouseid; private Position position; }


Warehouse外键关联Pisition, Position外键关联Shelf, Shelf外键关联houseid。
现在要对Warehouse使用Criteria查询, 查询House的id,可使用如下方法:

Java代码 复制代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse. class );   
  2. criteria.createAlias( "position" ,  "position" );   
  3. criteria.createAlias( "position.shelf" ,  "shelf" );   
  4. criteria.add(expression_r.eq( "shelf.house.houseid" ,  "111" ));  
Criteria criteria = BaseUtil.getCriteria(Warehouse.class); criteria.createAlias("position", "position"); criteria.createAlias("position.shelf", "shelf"); criteria.add(expression_r.eq("shelf.house.houseid", "111"));


如果要查询House的name, 必须再关联House表:

Java代码 复制代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse. class );   
  2. criteria.createAlias( "position" ,  "position" );   
  3. criteria.createAlias( "position.shelf" ,  "shelf" );   
  4. criteria.createAlias( "shelf.house" ,  "house" );   
  5. criteria.add(expression_r.eq( "house.housename" ,  "name A" ));  
Criteria criteria = BaseUtil.getCriteria(Warehouse.class); criteria.createAlias("position", "position"); criteria.createAlias("position.shelf", "shelf"); criteria.createAlias("shelf.house", "house"); criteria.add(expression_r.eq("house.housename", "name A"));


以上代码就可以实现了。

可是还会出现一个问题:如果表路径position已经被关联过了(比如此criteria是传入的参数,已经关联了Alias路径position, 并查询过了),则会报错。解决方法:
检查criteria里面关联的路径,如果已经关联,则不再关联,直接使用就行了。

Java代码 复制代码
  1. class  CriteriaUtil{   
  2. public   static  Criteria addAlias(CriteriaImpl criteriaImpl, String path, String name){   
  3.    if (path ==  null )  return  criteriaImpl;   
  4.    for (Iterator iter = criteriaImpl.iterateSubcriteria();iter.hasNext();){   
  5.     Subcriteria subCriteria = (Subcriteria)iter.next();   
  6.      if (path.equals(subCriteria.getPath()))   
  7.        return  criteriaImpl;   
  8.   }   
  9.    return  criteriaImpl.createAlias(path, name);   
  10. }   
  11. }  
class CriteriaUtil{ public static Criteria addAlias(CriteriaImpl criteriaImpl, String path, String name){ if(path == null) return criteriaImpl; for(Iterator iter = criteriaImpl.iterateSubcriteria();iter.hasNext();){ Subcriteria subCriteria = (Subcriteria)iter.next(); if(path.equals(subCriteria.getPath()))
                  


(注:这段代码有时是存在问题的,不是所有的Criteria 都能转换为CriteriaImpl,可能会是Subcriteria。因此,需要确保传入的参数为CriteriaImpl)

调用代码就变成:

Java代码 复制代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse. class );   
  2. CriteriaUtil.addAlias((CriteriaImpl)criteria,  "position" ,  "position" );   
  3. CriteriaUtil.addAlias((CriteriaImpl)criteria,  "position.shelf" ,  "shelf" );   
  4. criteria.add(expression_r.eq( "shelf.house.houseid" ,  "111" )); 
Criteria连表查询 Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询 立即下载

相关推荐

一个基于ZYNQ、AXI接口的PL端卷积加速器,可由PS端调用(附Github源码)

一个基于ZYNQ,AXI接口的PL端卷积加速器,可由PS端调用开发板型号:Zynq-7000 SoC XC7Z305 FPGA开发平台:Vivado 2019.1;Github源码链接:https://github.com/CY0807/ZYNQ_PL_CONV_ACC。

跳跳骑士的博客 1306

Hibernate Criteria对关联查询的实现

关联查询可分为两种: A) 实体间有定义关联关系的(一对多,多对一等) 对已定义关联关系的,我们可以使用createAlias()来创建属性的别名,然后引用别名进行条件查询,如: Criteria criteria = session.createCriteria(Parent.class); criteria.createAlias("children", "c").add(...

bto310 1000

官网下载stm32Fx固件库(标准外设)详细步骤

官网下载stm32f407固件库(标准外设)详细步骤

qq_52632983的博客 1万+

Criteria关联查询

表Prizewinner id 表Treatise cgid select * from Prizewinner p , Treatise t where p.cgId = t.id //hibernate:Criteria critera = getSession().createCriteria(Prizewinner.class

carl_jiang的专栏 2414

EGO_Plannerv2代码学习(一):栅格建图之V1 V2的区别

最近在尝试将高飞老师的集群规划器部署到真实无人机上跑一下,开这个新帖记录下学习过程中的问题和想法。

qq_41069236的博客 5753

基于Joplin和Joplin Server搭建私有云笔记

我们知道,多端同步功能是笔记工具最重要的功能。只有实现了多端同步,我们才能在工作电脑和手机之间无缝切换笔记体验。Joplin 在同步上做得不错,支持 Dropbox、OneDrive 和 AWS s3(当然国内都没法用),支持 WebDAV 协议,也支持自家的 Joplin Server。 本文介绍如何在自己的服务器上搭建 Joplin Server,并配置好 Joplin Desktop 的同步功能。 前置条件 安装docker 创建 Joplin Server 配置文件 创建配置文件,~/docke

代码时光 1万+

用criteria进行关联查询--hibernate 的ResultTransformer

引用 两个实体 Parent(P) 和 Child(C)之间是1:N的关系,现要求符合指定条件的P及所包 含的C 采用hibernate中的Criteria来实现此功能的代码如下: Java代码 Criteria criteria = this.getCriteria(Parent.class);     //连接关联子对象child,且指定了连接方式为左外连接...

小宝 511

Accelstepper 库中的参数计算公式

要完全调试电机的各个参数,例如最大速度,加速度等,就需要了解其计算公式和原理。 以下是代码注释: /// This code uses speed calculations as described in /// "Generate stepper-motor speed profiles in real time" by David Austin/// http://fab.cba.mi...

wenguitao的博客 4456

hibernate criteria 多表关联查询

当QBC criteria关联查询的时候一般都需要取别名。今天就遇到一个问题 先贴代码: @Override public SearchResult findListPageByKeyword(Integer page, Integer pageSize, String keyword, Long airlineCompanyId, Integer transfNum) { Cri

程序员 1万+

用 CORRESPONDING #( ) 优雅复制同名字段:从 MOVE-CORRESPONDING 到现代 ABAP 结构映射的关键差异与最佳实践

摘要:本文深入探讨了SAP ABAP中结构数据复制的两种主要方式——传统MOVE-CORRESPONDING与现代CORRESPONDING #()的核心差异。重点分析了现代构造表达式会初始化目标结构的关键特性,通过SAP_GWFND开发中的实际案例展示了这一差异可能引发的线上问题。同时介绍了使用BASE保留目标字段值的技巧,以及通过MAPPING处理字段名不一致的场景。文章为ABAP开发者提供了在S/4HANA、BTP及RAP等现代架构下的数据映射最佳实践,帮助规避常见的维护陷阱。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2262

【异常】OpenClaw网关仪表盘 pairing required 报错排查与解决方案

在OpenClaw网关仪表盘页面,完成WebSocket URL、网关令牌等必填项配置后,点击「连接」按钮尝试建立网关连接时,页面下方出现红色报错提示框,核心报错内容为,无法完成网关连接建立,且该报错在令牌配置正确、网络链路通畅的场景下仍会触发。该报错常见于非本地回环地址的访问场景,包括局域网远程访问、公网域名/IP访问、云服务器部署的网关远程管理等场景,本地127.0.0.1回环地址访问通常可正常连接。

奶爸的编程之路,也就一周冷个三天 1081

Hibernate之Criteria查询

Hibernate中提供了三种查询方式,分别为HQL、Criteria查询、本地化SQL查询,实际应用中,有很多人忽略了Criteria的用处,觉得不如另外两种贴近SQL方式便捷,实际则未必,很多情况下Criteria更具有优势;本篇文章就对Criteria查询做一个全面的介绍,以期尽可能的将更多的Criteria强大的查询功能展现出来; 1、首先新建一个Maven Web Project项目,

yu102655的专栏 1万+

C/C++小宇宙代码(完整代码)

C语言实现小宇宙的完整代码。

AIGC 2524

Hibernate Criteria 多层次查询关联问题

hibernate存在如下表及关联: class House{ private string houseid; private string housename; } class Shelf{ private string shelfid; private House house; } class Position{ private strin

qq_31230529的博客 505

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Hibernate Criteria 关联查询

前面讲了Criteria看起来比HQL顺眼多了,接着继续。如果每个美女都有自己的客户资源(不要想歪了!),那么需要查询拥有客户Gates的美女怎么办?使用Criteria可以有两种方法:1:DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createCriteria("customers");bea

Practices of a Developer 2865

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Hibernate之条件查询(Criteria Queries)

1、创建一个Criteria 实例      org.hibernate.Criteria接口表示特定持久类的一个查询。Session是Criteria实例的工厂。 Criteria crit = session.createCriteria(Teacher.class); crit.setMaxResults(50); List cats = crit.list(); 2、限制

itmyhome的专栏 3993

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

加强hibernate的criteria查询中的使用Example查询的

有人说Query更强大,但我人个比较喜欢用criteria,觉得使用criteria才符合Java开发的规范。 但criteria在使用example进行关联的对象查询时,会得到非预期的结果。 举个例子: 两个简单实体类Department:(部门) 以及另一个类Employee:(员工) 这两个表的关联关系我就不多说了,这行都应该都懂,呵呵。。。        此时,我需要通过一些

amazing83的专栏 3154

Hibernate Criteria的嵌套查询

假设有Artist和Track实体,是1对多的关系,现在我们想使用Criteria查询所有artist中,其对应的Track实体集合中,有名为track1的Track实体所对应的Artist比较乱,用SQL来举例只有artist1和artist2对应的track集合中1有名为“track1”的记录,我们就要找出artist1和artist2来create table artist(

我的世界我的梦 5166

了解hibernate的Criteria查询

hibernate提供的Criteria查询更加符合面向对象的做法。当访问college对象关联的studens时候,hibernate还是会发出一个查询语句,返回college下的所有student。如果要实现过滤功能,需要使用hibernate中的ResultTransformer。通过Criteria关联查询可以看出:一旦在实体映射文件中配置好关联关系后,当访问关联实体的时候,hibernate会发出查询语句再次查询关联的实体,除非我们自己去设置关联的实体对象。

aty 1486

Hibernate:Criteria多表关联查询的试用

本人近期刚做的一个项目中需要试用Criteria的都表查询功能,查询的功能是这样的: TableA、TableB、TableC、TableD四个表是有关联关系的,TableA与TableB为多对一关系,TableB与TableC为一对多关系,TableC与TableD为多对一关系,见图: 而我的业务是查TableA的内容,不过有一个条件在TableD中,所以这4张表都要用上,废话不多说了:

HA7419的专栏 3900

Hibernate条件查询(Criteria Query)

1、创建一个Criteria实例net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。 Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();2、缩小结果集范围一个查询条件(Cr

键者天行 7433

Java 框架 01 — Hibernate 03(表关联及其配置文件设置、查询总结、HQL查询、Criteria查询)

文章目录0 回顾0.1 hibernate主键生成策略0.2 hibernate基本查询0.2.1 HQL0.2.2 Criteria0.2.3 SQL0.3 hibernate事务一、表关联的关系1.1 一对多(1-n)1.1.1 添加关联关系1.1.1.1 被引用表(1表)配置文件1.1.1.2 被应用表(n表)配置文件1.1.2 删除操作1.2 多对多(n-n)1.2.1 添加用户、角色/...

文泽路小男孩的博客 1085

hibernate 条件查询(Criteria Queries)

16.1. 创建一个Criteria 实例 org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。 Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats =

budongheshang的专栏 717

Hibernate查询方式及关联

Hibernate查询方式 hql:hibernate QUery Language :以字符串的形式进行数据查询。 -------------面向对象的字符串格式。 原生sql/本地查询:就是纯粹的sql语句。 Criteria查询:动态生成查询语句。 2.使用hql的步骤: ---获得session a.创建Query对象,并且执行sql语句 b.接受返回值。 c.处

新仅可的博客 1309

Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o

Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o   1. Criteria,,Criterion ,, 1 2. 主要的对象黑头配置磊个关联,三 1 3. Criteria 黑头配置关联查询了... 2 4. Ati Meata 配置关联 @CriteriaRelt 2 5. 关联createCriteria() 3 6.

attilax的专栏 2045
上一篇: hibernate hql函数
下一篇: hibernate Isolation Level(事务隔离等级)
programloverjack
博客等级 码龄17年 5粉丝 252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值