今天徒弟用到了一句复杂的查询语句。。。。结果执行报错,但是在SQL中执行没有问题,于是来求助我了。。。

语句的HQL/SQL格式如下:

select count(1) ,cxltype,sum(dzsje),sum(iperson)from (select xl.cxltype,g.iperson,(select sum(y.dzsje) from Ysklist as y where y.cykpid = g.cregno) as dzsje from Guestreg as g,Xl as xl where g.xluuid = xl.uuid   ) as t where  …… group by t.cxltype

结果执行出错,最终发现,HQL无法支持from后面跟子查询的方式,网上查了N多资料,发现遇到这个问题的人还真是不少,但每一个相关的问题帖都没有满意的答复,甚至于多数都是没有跟帖的。。。。

一阵心寒,hibernate叱咤风云,竟然对这个支持如此之弱?虽然这个语句可以通过另外的方法来做(比如建视图或者直接使用SQL来做),但总是不甘心,于是又开始查阅各处资料,最后找到了思路,觉得既然HQL不支持,那么只能把这种子查询封装为对象来做了,那么肯定是需要hbm配置这种临时的子查询对象的,于是开始着手hbm配置的资料中查,hbm中配置对象的都是class标签,开始把范围缩小,针对hbm的class标签的属性资料开始翻查,找到了几个比较可能的属性,where、subselect、mutable、entity-bean,貌似这些都可能跟临时对象有关。。。

于是反复尝试,并继续翻查资料

最终在Hibernate reference 3.2.0 ga 正式版中文参考手册中找到了一些比较可靠的资料:

5.1.3. class

你可以使用class元素来定义一个持久化类:

name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。

table (可选 - 默认是类的非全限定名): 对应的数据库表名。

discriminator-value (可选 - 默认和类名一样): 一个用于区分不同的子类的值,在多态行为时使用。它可以接受的值包括 nullnot null

mutable (可选,默认值为true): 表明该类的实例是可变的或者不可变的。

schema (可选): 覆盖在根<hibernate-mapping>元素中指定的schema名字。

catalog (可选): 覆盖在根<hibernate-mapping>元素中指定的catalog名字。

proxy (可选): 指定一个接口,在延迟装载时作为代理使用。 你可以在这里使用该类自己的名字。

dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。

dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。

select-before-update (可选, 默认为 false): 指定Hibernate除非确定对象真正被修改了(如果该值为true-译注),否则不会执行SQL UPDATE操作。在特定场合(实际上,它只在一个瞬时对象(transient object)关联到一个 新的session中时执行的update()中生效),这说明Hibernate会在UPDATE 之前执行一次额外的SQL SELECT操作,来决定是否应该执行 UPDATE

polymorphism(多态) (可选, 默认值为 implicit (隐式) ): 界定是隐式还是显式的使用多态查询(这只在Hibernate的具体表继承策略中用到-译注)。

where (可选) 指定一个附加的SQLWHERE 条件, 在抓取这个类的对象时会一直增加这个条件。

persister (可选): 指定一个定制的ClassPersister

batch-size (可选,默认是1) 指定一个用于 根据标识符(identifier)抓取实例时使用的"batch size"(批次抓取数量)。

optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。

(16)

lazy (可选): 通过设置lazy="false", 所有的延迟加载(Lazy fetching)功能将被全部禁用(disabled)。

(17)

entity-name (可选,默认为类名): Hibernate3允许一个类进行多次映射( 前提是映射到不同的表),并且允许使用Maps或XML代替Java层次的实体映射 (也就是实现动态领域模型,不用写持久化类-译注)。 更多信息请看第 4.4 节 “动态模型(Dynamic models)” and 第 18 章 XML映射

(18)

check (可选): 这是一个SQL表达式, 用于为自动生成的schema添加多行(multi-row)约束检查

(19)

rowid (可选): Hibernate可以使用数据库支持的所谓的ROWIDs,例如: Oracle数据库,如果你设置这个可选的rowid, Hibernate可以使用额外的字段rowid实现快速更新。ROWID是这个功能实现的重点, 它代表了一个存储元组(tuple)的物理位置。

(20)

subselect (可选): 它将一个不可变(immutable)并且只读的实体映射到一个数据库的 子查询中。当你想用视图代替一张基本表的时候,这是有用的,但最好不要这样做。更多的介绍请看下面内容。

(21)

abstract (可选): 用于在<union-subclass>的继承结构 (hierarchies)中标识抽象超类。

注意其中红色的字体,这就是关键之处,往下我找到了相关的内容:

对Hibernate映射来说视图和表是没有区别的,这是因为它们在数据层都是透明的( 注意:一些数据库不支持视图属性,特别是更新的时候)。有时你想使用视图,但却不能在数据库 中创建它(例如:在遗留的schema中)。这样的话,你可以映射一个不可变的(immutable)并且是 只读的实体到一个给定的SQL子查询表达式:

定义这个实体用到的表为同步(synchronize),确保自动刷新(auto-flush)正确执行, 并且依赖原实体的查询不会返回过期数据。<subselect>在属性元素 和一个嵌套映射元素中都可见。

显然这就是我一直在找的东东了,hibernate支持自身建立视图,而不需要依赖于数据库。。虽然它本身的说法这是用来替代视图的,但其实这就是带子查询的sql,看我们最终的配置结果。

临时子查询视图Bean[其中第二个非默认的构造函数是不能少的,不然对象无法创建]:

    1. public class TestBean {
  1. private Integer id;
  2. private String cxltype;
  3. private Integer iperson;
  4. private Double dzsje;
  5. public TestBean(){}
  6. public TestBean(String cxltype, Integer iperson, Double dzsje) {
  7. super();
  8. this.cxltype = cxltype;
  9. this.iperson = iperson;
  10. this.dzsje = dzsje;
  11. }
  12. public String getCxltype() {
  13. return cxltype;
  14. }
  15. public void setCxltype(String cxltype) {
  16. this.cxltype = cxltype;
  17. }
  18. public Integer getIperson() {
  19. return iperson;
  20. }
  21. public void setIperson(Integer iperson) {
  22. this.iperson = iperson;
  23. }
  24. public Double getDzsje() {
  25. return dzsje;
  26. }
  27. public void setDzsje(Double dzsje) {
  28. this.dzsje = dzsje;
  29. }
  30. public Integer getId() {
  31. return id;
  32. }
  33. public void setId(Integer id) {
  34. this.id = id;
  35. }
  36. }

TestBean的hbm配置:

    1. <hibernate-mapping>
  1. <class name="TestBean" mutable="false">
  2. <subselect>
  3. select xl.cxltype,g.iperson,(select sum(y.dzsje) from Ysklist as y where y.cykpid = g.cregno) as dzsje
  4. from Guestreg as g,Xl as xl
  5. where g.xluuid = xl.uuid
  6. </subselect>
  7. <synchronize table="Guestreg"/>
  8. <synchronize table="Xl"/>
  9. <id name="id" type="integer">
  10. <column name="id" />
  11. <generator class="identity" />
  12. </id>
  13. <property name="cxltype" type="string">
  14. <column name="cxltype"></column>
  15. </property>
  16. <property name="iperson" type="integer">
  17. <column name="iperson"></column>
  18. </property>
  19. <property name="dzsje" type="double">
  20. <column name="dzsje"></column>
  21. </property>
  22. </class>
  23. </hibernate-mapping>

HQL语句:

select t.cxltype,sum(t.dzsje),sum(t.iperson) from TestBean as t where …… group by t.cxltype

Hibernate生成的SQL语句:

Hibernate: select testbean0_.cxltype as col_0_0_, sum(testbean0_.dzsje) as col_1_0_, sum(testbean0_.iperson) as col_2_0_ from (
     select xl.cxltype,g.iperson,(select sum(y.dzsje) from Ysklist as y where y.cykpid = g.cregno) as dzsje
     from Guestreg as g,Xl as xl
     where g.xluuid = xl.uuid
     ) testbean0_ where 1=1 group by testbean0_.cxltype
可以看得出来,这就是文章最开始要完成的SQL子查询语句

到此告一段落,花了我半个下午的时间搞定。。。

而这个问题也是很久以前我一开始就怀疑hibernate的HQL灵活性的一个困惑,一直觉得Hibernate在多表查询上是一个弱项,但我也一直没有找时间去深究过,而经过这次问题,让我对Hibernate又多认识了一些。。呵呵,以后可以更放心的去用它了


http://www.taodudu.cc/news/show-6039998.html

相关文章:

  • SIFT(尺度不变特征变换)的原理分析
  • 【C语言基础】关于电子科技大学的复试c语言试题
  • Go中sync 包的 Once 使用
  • Linux--pthread_once 的用法
  • java作业6
  • java作业7
  • C++转Java个人银行账户管理程序
  • Java作业(2020 12 05)
  • 微众银行AI团队领衔推动人工智能国际标准的制定
  • 计算机辅助英语教学 研究背景,精选:信息时代背景下的英语教学原稿
  • 计算机在英语教学中的应用课题,浅谈信息技术在英语教学中的应用
  • 计算机辅助英语教学 研究背景,信息时代背景下的英语教学(原稿)
  • 高并发解决套路
  • 浅谈千万级高性能高并发网站架构
  • 网站高并发访问
  • 高性能网站设计
  • 人体工学电脑椅选购建议 | 潘魏增
  • 网站设计高性能高并发
  • 实现网站的高并发访问
  • 信用卡账单采集解析系统设计
  • 移动终端软件高级开发技术------- 记账本
  • 嗖嗖移动大厅项目
  • 嗖嗖移动业务大厅小项目
  • 移动支付系统
  • 不相交轮换的乘积怎么求_怎么样将一个轮换分解成不相交的轮换的乘积
  • “互联网+”环境下高职毕业生求职风险应对策略
  • 【能效管理】电力监控系统在某商业数据中心的应用分析
  • 卷 积
  • 新的征程!
  • 我是阿圆,我们明年见。

hibernate HQL 使用from (select ……)子查询的方法相关推荐

  1. select子查询多个字段_SQL复杂查询

    一.视图 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询. 优点: • 重用SQL语句. • 简化复杂的SQL操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节. ...

  2. mysql select 子查询_SELECT中常用的子查询操作

    MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句.DML语句中也都会常用到子查询. 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中: 在 ...

  3. yii mysql条件查询_mysql – 在Yii2 find()/ QueryBuilder中使用WHERE条件的SELECT子查询

    我能够找到子查询构建的简单示例,但是当我需要包含WHERE条件时,我无法弄清楚或找不到解决方案.我试图模拟以下声明-- SELECT ParentTable.*, (SELECT MAX(ChildT ...

  4. mybatis 一对多关系映射 select子查询 只有一条数据 解决方案

    一般一对多 多的那个会是联合主键 所以要这么设置 <resultMap id="CfdMap" type="com.sxq.cloud.entity.ZhyyB2C ...

  5. mysql子查询的方式_分布式系统中一种迭代处理MYSQL子查询的方法

    1.技术背景 1.1 背景技术 在分布式mysql中间件系统,DML语句中,子查询需要可能涉及到多个数据分片,如果在DML语句使用子查询,需要首先解析出子查询的具体内容,然后根据路由把子查询发往到各个 ...

  6. 用子查询的方法查找研发部比财务部所有雇员收入都高的雇员的姓名

    第一遍: mysql> select 姓名 from employees-> where 编号 =-> (select 编号 from employees-> where 收入 ...

  7. java mysbatis select_MyBatis SELECT基本查询实现方法详解

    1.返回一个LIST select * from tbl_employee where last_name like #{lastName} 2.将查询记录封装为一个Map select * from ...

  8. 数据库select的查询使用方法

    常规查询 查询所有字段:select * from 表名; 查询指定字段:select 列1,列2,... from 表名; 使用 as 给字段起别名: select 字段 as 名字.... fro ...

  9. ResultTransformer deprecated 替代方案及HQL无法使用子查询解决

    hibernate 由于从5.2升级成5.4 再用了ResultTransformer封装临时对象时sonar 报错,显示ResultTransformer 过时 官方在5.2版本中将此方法标记为过时 ...

最新文章

  1. 【思维导图】音乐为何会让我们产生特定情绪?
  2. GitHub、Git与TortoiseGit基本操作
  3. 三载春秋随风去,而今迈步从头越
  4. 机械设计软件编写心得
  5. spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式
  6. 江苏省计算机二级C操作题汇编
  7. ...............
  8. 吴琦:没有被“双非学历”困住的边界突破者
  9. 站在2018看单片机和嵌入式芯片方案选型和发展趋势
  10. 用npm安装yarn
  11. 计算机专硕一般研二在干嘛,专硕一般研二在干嘛,专硕两年怎么安排
  12. java商城源码视频教程_Java商城秒杀系统设计视频教程学习下载(含项目源码)...
  13. php打包签名apk文件在哪,Android_android应用签名详细步骤,1、准备工作apk的签名工作可以 - phpStudy...
  14. sublime插件之sidebar
  15. Sourcetree安装详细(最新版本)
  16. 走遍美国 —— 各州及其别名
  17. 利用手机实现计算机无线上网的设置过程,win10系统使用点对点无线网络实现手机共享上网的具体方案...
  18. 基于链表的多级菜单设计
  19. 系统(架构)设计五要素
  20. 2022-04-21 Omnet学习笔记(一)

热门文章

  1. Android中百度地图基础实现,定位
  2. CAR-T细胞治疗最新进展(2021年12月)
  3. Frida—HOOK 学习笔记2
  4. Tomcat安装及环境配置教程
  5. 透明图片怎么发给别人_如何在网上 1 分钟就搜到高清优质图片?这 3 个搜图网站一定要收藏好...
  6. Android开发者上手宝典(三)
  7. 【综合算法】不考虑误差的TDOA定位
  8. 怎样免费将多个pdf文件合并为一个
  9. 菜鸡哈屠教你合并果子
  10. 9 张手绘图:阐明机器学习模型训练全流程