• Hibernate HQL中的子查询


    子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持。
     
    如下面代码所示:
    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字句之后的那种动态视图子查询。
  • 相关阅读:
    RabbitMQ架构面试题答不出来怎么办!大佬手绘架构图带你分分钟搞懂!
    【秋招必备】大数据面试题100道(2021最新版)
    【秋招必备】设计模式面试题(2021最新版)
    【秋招必备】TCP,UDP,Socket,Http网络编程面试题(2021最新版)
    3分钟带你玩转MySQL体系结构和查询原理!
    易车面试官:说说MySQL内存结构、索引、集群、底层原理!
    【秋招必备】Mybatis面试题(2021最新版)
    iOS-项目开发1
    ReactNatvie遇到的错误
    细节
  • 原文地址:https://www.cnblogs.com/diaoyan/p/6434566.html
Copyright © 2020-2023  润新知