当前位置:首页 > Hibernate > 正文内容

HQL中的子查询

canca11年前 (2014-08-28)Hibernate371
子查询:
  子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在HibernateHQL查询同样对子查询功能提供了支持。如下面代码所示:
List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list();
上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为:
Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);
如果子查询返回多条记录,则可以使用下面关键字:
all:表示子查询语句返回的所有记录
any:表示子查询语句返回的任意一条结果
some:”any”等价
in:”=any”等价
exists:表示子查询语句至少返回一条记录
例如:查询存在一条订单价格大于100的客户
From Customer c where 100>any(select o.price from c.orders o);
如果在子查询中操作集合,HQL提供了一组操纵集合的函数和属性:
size()函数和size属性:获得集合中元素的数量
minIndex()函数和minIndex属性:对于建立了索引的集合获得最小索引值(关于集合索引参考第一部分映射值类型集合)
minElement()函数和minElement属性:对于包含基本类型的元素集合,获得集合中值最小的元素
maxElement()函数和maxElement属性:对于包含基本类型元素的集合,获得集合中值最大的元素
element()函数:获得集合中所有元素
例如:查询订单数大于0的客户
From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
以上HQL语句会生成类似如下的SQL语句:
Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id);
注:在HQL中子查询必须出现在where子句中,而且必须用一对圆括号括起来。为什么必须要出现在where字句之后呢?其实我们大家仔细想一下也就知道了,在Hibernate中查询的任何一个实体对象都要有据可循,这个“据”就是Hibernate的主配置文件,也就是说凡是出现在HQL from字句中的实体对象,都必须要在Hibernate主配置文件中有明确的配置。所以在Hibernate中无法支持SQL语句中的那种出现在from字句之后的那种动态视图子查询。

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/109.html

标签: Hibernate
分享给朋友:
返回列表

上一篇:Hibernate Annotation mappedBy注解理解

没有最新的文章了...

“HQL中的子查询” 的相关文章

如何把Hibernate2.1升级到Hibernate3.0?

1.1 Hibernate API 变化 1.1.1 包名 1.1.2 org.hibernate.classic包 1.1.3 Hibernate所依赖的第三方软件包 1.1.4 异常模型 1.1.5 Session接口 1.1.6 createSQLQuery() 1.1.7 Lifecycle...

Hibernate读取Blob乱码

        在项目中又遇到乱码了!这我已经司空见惯了。呵呵.说说Hibernate读取Blob时为什么会乱码吧!!         说Blob乱码...

Hibernate + Proxool连接池

费话就不说啦! hibernate.cfg.xml 加入: <property name="hibernate.proxool.pool_alias">dbpool</property>  <property name="hibernate.prox...

关于VO、PO的理解

O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。  VO,值对象(Value Object),PO,持...

java.lang.IllegalAccessError: tried to access method net.sf.ehcache.CacheManager.()V from class org.hibernate.cache.EhCacheProvider

今天把项目从Tomcat下转移到JBOSS了,启动JBOSS服务器之后出了,控制台输出了java.lang.IllegalAccessError: tried to access method net.sf.ehcache.CacheManager.<init>()V from clas...

Hibernate 一对一主键单向关联

1-1的关联可以基于主键关联,但基于主键关联的持久化类不能拥有自己的主键生成策略,它的主键由关联类负责生成.另外,另外,增加one-to-one元素来关联属性,必须为one-to-one元素增加constrained="true"属性,表明该类主键由关联类生成.    ...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。