知识大全 Hibernate 高级查询技巧
Posted 语句
篇首语:满堂花醉三千客,一剑霜寒十四洲。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate 高级查询技巧相关的知识,希望对你有一定的参考价值。
Hibernate 高级查询技巧 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
集合过滤:
对于一个已经加载的Customer对象 假设对它的orders集合采用延迟加载机制 那么当调用customer getOrders(erator()时 Hibernate就会初始化orders集合 然后到数据库中去加载Customer对象所关联的Order对象 并且填充orders集合 但是很多时候我们其实只是需要关联对象中符合某些条件的一部分对象 而并不需要加载全部关联对象 而对性能带来无谓的开销 这时候我们就可以利用Hibernate的集合过滤功能 来处理关联对象的加载 我们看下面的代码:
List list=session createFilter(customer getOrders() where this price> order by this price ) list();
for(int i= ;i<list size();i++)
Order order=(Order)list get(i);
在上面代码中通过session createFilter()方法 创建了一个集合过滤的查询对象 这个方法需要两个参数 第一个参数指定需要进行过滤操作的集合 第二个参数指定过滤集合的条件 方法返回Query对象 这个方法不要求它所要操作的集合对象已经初始化 但是要求包含这个集合对象的实体对象必须处于持久化状态 当执行list()方法时不管持久化对象的集合是否已经初始化 都会到数据库中去检索数据 为了保证在Hibernate缓存中不会出现OID相同的对象 如果集合对象已经初始化 list()方法不会创建新的关联实体对象 而仅仅返回已经存在的关联实体对象 如果集合对象还没有初始化 那么list()方法会创建关联实体对象 但是不会初始化容纳关联实体对象的集合 除了可以向集合对象添加过滤条件进行稽核过滤之外 还可以进行很多其他操作 看下面的代码:
① 对集合对象进行分页:
List list=session createFilter(customer getOders() order by this price asc )
setFirstResult( )
setMaxResults( )
list();
② 检索集合中关联对象的一个属性:
List list=session createFilter(customer getOrders() select this ordernumber ) list();
子查询:
子查询是SQL语句中非常重要的功能特性 它可以在SQL语句中利用另外一条SQL语句的查询结果 在Hibernate中HQL查询同样对子查询功能提供了支持 如下面代码所示:
List list=session createQuery( from Customer c where >(select count(o) from c orders o) ) list();
上面的程序查询订单数超过 的所有客户 因此和上面子查询HQL语句对应的SQL语句为:
Select * from Customer c where >(select count(o id) from Order o where c id=o customer_ID);
如果子查询返回多条记录 则可以使用下面关键字:
all:表示子查询语句返回的所有记录
any:表示子查询语句返回的任意一条结果
some:与 any 等价
in:与 =any 等价
exists:表示子查询语句至少返回一条记录
例如:查询存在一条订单价格大于 的客户
From Customer c where >any(select o price from c orders o);
如果在子查询中操作集合 HQL提供了一组操纵集合的函数和属性:
size()函数和size属性:获得集合中元素的数量
minIndex()函数和minIndex属性:对于建立了索引的集合获得最小索引值(关于集合索引参考第一部分映射值类型集合)
minElement()函数和minElement属性:对于包含基本类型的元素集合 获得集合中值最小的元素
maxElement()函数和maxElement属性:对于包含基本类型元素的集合 获得集合中值最大的元素
element()函数:获得集合中所有元素
例如:查询订单数大于 的客户
From Customer c where size(c orders)> ;或者From Customer c where c orders size> ;
以上HQL语句会生成类似如下的SQL语句:
Select * from customer c where >(select count(o id) from order where o customer_ID =c id);
cha138/Article/program/Java/ky/201311/28615相关参考
Hibernate高级查询实战[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 《取TOP结
Hibernate高级查询实战[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 大家知道在H
在hibernate中是支持多条件动态查询的这种问题是非常实用的比如说你做一个项目要实现一个复合查询 例如有这么一个界面 那么要实现这个查询对于用户来说他的查询条件可能不健全有可能只填写其
Hibernate本地SQL查询 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本地SQL查询来
Hibernate复合主键查询 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hibernate
Hibernate数据查询 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! HibernateQu
Hibernate属性查询简介 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本文向大家介绍Hi
首先定义一个条件查询实例这里要有一个主表(mainTable) DetachedCriteriadeCriteria=DetachedCriteriaforClass(mainTableclas
Hibernate命名查询NamedQuery 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 例
Hibernate查询方法之探析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! :QBE(Que