三、连接查询
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:覆盖映射配置文件的检索策略,在程序中指定延迟检索策略。
待续!
分享到:
相关推荐
NULL 博文链接:https://364232252.iteye.com/blog/2368725
Hibernate连接SQLite配置步骤: 1、添加SQLite库: 1.1、将两个jar包:com.zy.hibernate.dialect.SQLiteDialect.jar、sqlite-jdbc-3.7.2.jar拷贝到“\WEB-INF\lib”文件夹下; 2、配置hibernate: 2.1、将...
Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP 在配置连接池时需要注意的有三点: 一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在...
hibernate分页查询 数据库连接,不错的分析,可以尝试下载易用。。
hibernate 连接池配置详解,四种连接方式:第一种方案,Hibernate默认连接池;第二种方案是:C3P0;第三种方案是:dbcp;第四种方案是:Proxool (推荐)
hibernate连接金仓数据库所需jar包集合。
hibernate的查询方式介绍和hibernate的批处理和连接池配置hibernate
Hibernate连接数据库的注册的项目
Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页
java利用hibernate连接数据库,hibernate应用范例
hibernate连接数据[Mysql]的代码实例
用hibernate连接mycat的例子,用xml,老了点但能用
Hibernate连接MySql小实例 环境:eclipse3.5 数据库:mysql 需要建立tc数据局,tc下有张user表,user表有id,name,pass项。 请在连接数据库配置文件hibernate.ctf.xml中配置用户名和密码 很容易理解的
hibernate连接池驱动程序 c3p0 proxool
Hibernate连接池的三种配置方式......
这是一个使用Hibernate连接mysql 的入门小程序,,本程序中间包含Hibernate的相关api包以及一个sql脚本语句,祝,大家学习顺利额~
java hibernate 的连接池简单介绍.不错的源代码,链接数据库的代码,可以下载试试
hibernate连接池配置的三种方式。
文档中列出了hibernate连接各种数据库的配置,同时也提供了使用c3p0连接各种数据库的配置,非常方便您的开发。
前些日子公司要做的,因为客户数据量较小,所以数据库用的access,这是开始连接测试的例子,下载后main函数是Test。