转自:http://aumy2008.blogbus.com/logs/13941318.html
三、连接查询
HQL和QBC支持的各种连接类型
在程序中指定的链接查询类型
|
HQL语法
|
QBC语法
|
使用范围
|
内连接
|
inner join 或者 join
|
Criteria.createAlias()
|
适用于有关联的持久化类,并且在映射文件中对这种关联关系作了映射。
|
迫切内连接
|
inner join fetch 或者 join fetch
|
不支持
|
隐式内连接
|
|
不支持
|
左外连接
|
left outer join 或者 left join
|
不支持
|
迫切左外连接
|
left outer join fetch 或者 left join fetch
|
FetchMode.EAGER
|
右外连接
|
right outer join 或者 right join
|
不支持
|
交叉连接
|
ClassA,ClassB
|
不支持
|
适用于不存在关联关系的持久化类
|
1、默认情况下关联级别的运行时检索策略
采用配置文件中设置的检索策略,但有一个例外,那就是HQL会忽略映射文件设置的迫切左外连接策略,改用立即检索。
2、迫切左外连接
显式指定对象的关联关系为迫切左外连接检索策略,可以覆盖映射文件中指定的检索策略。
例HQL
"from Customer c left join fetch c.orders o where c.name like 't%'"
+" o.name like 't%'"
例QBC
List reslut=session.createCriteria(Customer.class) .setFetchMode("orders",FetchMode.EAGER) .add(Expression.like("name","t",MatchMode.START))
.list();
当使用迫切左外连接检索策略时,查询结果中可能会包含重复元素,可以通过一个HashSet来过滤重复元素:List result=….list(); HashSet set=new HashSet(result);
Hibernate允许在一条查询语句中迫切左外连接多个多对一或一对一关联的类。
List reslut=session.createCriteria(A.class) .setFetchMode("this.b",FetchMode.EAGER) .setFetchMode("this.c",FetchMode.EAGER) .add(Expression.isNotNull("this.b")) .add(Expression.isNotNull("this.c"))
.list();
当存在传递关联时,可以通过HQL来同时迫切左外连接关联类和依赖关联类,但QBC无法表达这种形式的迫切左外连接。
3、左外连接
使用左外连接查询时,将根据映射文件的配置来决定关联的检索策略。
4、内连接
QBC也支持内连接查询
List reslut=session.createCriteria(Customer.class) .add(Expression.like("name","t",MatchMode.SRART)) .createCriteria("orders") .add(Expression.like("orderNumber","t",MatchMode.SRART))
.list();
默认情况下,QBC只检索出Customer对象,以上代码等同于以下HQL查询语句:
"select c from Customer c join c.orders o where c.name like 't%'"
+ " and o.orderNumber like 't%'";
createAlias()方法为关联属性(集合)赋予别名。如果希望QBC返回的集合也包含成对的Customer和Order对象,可以调用returnMaps()方法:
List reslut=session.createCriteria(Customer.class) .createAlias("orders","o") .add(Expression.like("this.name","t",MatchMode.SRART)) .add(Expression.like("o.orderNumber","t",MatchMode.SRART)) .returnMaps()
.list();
采用内连接查询时,HQL与QBC有不同的默认行为,前者检索成对的对象,后者仅检索出要检索的单个对象(不包含关联的对象)。
5、迫切内连接
显式指定对象的关联关系为迫切内连接检索策略,可以覆盖映射文件中指定的检索策略。
6、隐式内连接
一对一
"from Cunstomer c where c.homeAddress.provice like '%hai%'"
List reslut=session.createCriteria(Customer.class) .add(Expression.like("homeAddress.provice","t",MatchMode.SRART))
.list();
多对一
"from Order o where o.customer.name like '%hai%'"
QBC 不支持隐式内连接,下边是不正确的,:
List reslut=session.createCriteria(Order.class) .add(Expression.like("customer.name","t",MatchMode.SRART))
.list();
对于QBC,必须显式指定内连接查询:
List reslut=session.createCriteria(Order.class) .createAlias("customer","c") .add(Expression.like("c.name","t",MatchMode.SRART))
.list();
一对多或多对多
隐式内连接不适用。
7、右外连接
8、使用SQL风格的交叉连接和隐式内连接
HQL支持SQL风格的交叉连接查询。如: from Customer c, Order o
在SQL语言中,显式内连接查询的语句使用inner join关键字,并且用on字句设定连接条件,形式为:
"select * from CUSTOMER c inner join ORDER o on c.ID=o.CUSTOMER_ID"
隐式内连接查询语句不包含关键字阿,并且用where字句设定连接条件:
"select * from CUSTOMER c ,ORDER o where c.ID=o.CUSTOMER_ID"
9、关联级别运行是的检索策略
(1)没有显式指定,使用配置文件的,但有一个例外,那就是HQL会忽略映射文件设置的迫切左外连接策略,改用立即检索。
(2)如果显式指定,就会覆盖映射文件配置的检索策略。在HQL查询语句中显式指定检索策略包括以下内容。
l left join fetch
l inner join fetch
QBC通过FetchMode类来显式指定检索策略,有以下3个静态实例。
l FetchMode.DEFAULT:默认,采用配置;
l FetchMode.EAGER:覆盖,指定迫切左外连接检索策略;
l FetchMode.LAZY:覆盖映射配置文件的检索策略,在程序中指定延迟检索策略。
分享到:
相关推荐
Hibernate的检索方式: 5种
介绍了HIBERNATE的检索策略,可以此作为指引进行学习
Hibernate检索方式 孙卫琴的 pdf
java-Hibernate 检索
NULL 博文链接:https://364232252.iteye.com/blog/2368725
hibernate5--4.检索方式及策略
NULL 博文链接:https://364232252.iteye.com/blog/2368583
Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记Hibernate数据检索(HQL)笔记
魔乐科技,李兴华老师的Hibernate教程笔记,对Hibernate的基础知识进行了比较详细的讲解,对初学者有一个比较笼统的介绍,是带我们入门Hibernate的不二选择。
基于Spring的Hibernate Search全文检索功能示例 实例下载
Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
hibernate的注解开发 注解开发关联映射 HQL、QBC、本地SQL检索数据
本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。...本地SQL检索方式
Hibernate数据检索(HQL).rar
使用hibernate search实现全文检索和文档管理功能: 1 全文检索 2 手动生成索引 3 文档上传(自动建立索引) 4 文档更新(自动建立索引) 5 文档删除 使用说明: 1 需要先恢复数据库 searchDB_2008sqlserver.bak 2 ...
总结hibernate框架的常用检索方式 1、hibernate框架的检索方式有以下几种: OID检索:根据唯一标识OID检索数据 对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC...
本PPT描述了对SHH框架中hibernate数据检索功能的描述,用户可以更快的学习Hibernate数据检索
hibernate的延迟检索在轻量级J2EE框架中的应用
使用 hibernate-search 实现全文检索及文档管理的例子 1 全文检索 2 手动重新建立索引 3 文档上传(自动建立索引) 4 文档更新(自动建立索引) 5 文档删除