hibernate HQL 使用from (select ……)子查询的方法
今天徒弟用到了一句复杂的查询语句。。。。结果执行报错,但是在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
元素来定义一个持久化类:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(16) |
|
(17) |
|
(18) |
|
(19) |
|
(20) |
|
(21) |
|
注意其中红色的字体,这就是关键之处,往下我找到了相关的内容:
对Hibernate映射来说视图和表是没有区别的,这是因为它们在数据层都是透明的( 注意:一些数据库不支持视图属性,特别是更新的时候)。有时你想使用视图,但却不能在数据库 中创建它(例如:在遗留的schema中)。这样的话,你可以映射一个不可变的(immutable)并且是 只读的实体到一个给定的SQL子查询表达式:
定义这个实体用到的表为同步(synchronize),确保自动刷新(auto-flush)正确执行, 并且依赖原实体的查询不会返回过期数据。<subselect>
在属性元素 和一个嵌套映射元素中都可见。
显然这就是我一直在找的东东了,hibernate支持自身建立视图,而不需要依赖于数据库。。虽然它本身的说法这是用来替代视图的,但其实这就是带子查询的sql,看我们最终的配置结果。
临时子查询视图Bean[其中第二个非默认的构造函数是不能少的,不然对象无法创建]:
- public class TestBean {
- private Integer id;
- private String cxltype;
- private Integer iperson;
- private Double dzsje;
- public TestBean(){}
- public TestBean(String cxltype, Integer iperson, Double dzsje) {
- super();
- this.cxltype = cxltype;
- this.iperson = iperson;
- this.dzsje = dzsje;
- }
- public String getCxltype() {
- return cxltype;
- }
- public void setCxltype(String cxltype) {
- this.cxltype = cxltype;
- }
- public Integer getIperson() {
- return iperson;
- }
- public void setIperson(Integer iperson) {
- this.iperson = iperson;
- }
- public Double getDzsje() {
- return dzsje;
- }
- public void setDzsje(Double dzsje) {
- this.dzsje = dzsje;
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- }
TestBean的hbm配置:
- <hibernate-mapping>
- <class name="TestBean" mutable="false">
- <subselect>
- 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
- </subselect>
- <synchronize table="Guestreg"/>
- <synchronize table="Xl"/>
- <id name="id" type="integer">
- <column name="id" />
- <generator class="identity" />
- </id>
- <property name="cxltype" type="string">
- <column name="cxltype"></column>
- </property>
- <property name="iperson" type="integer">
- <column name="iperson"></column>
- </property>
- <property name="dzsje" type="double">
- <column name="dzsje"></column>
- </property>
- </class>
- </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 ……)子查询的方法相关推荐
- select子查询多个字段_SQL复杂查询
一.视图 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询. 优点: • 重用SQL语句. • 简化复杂的SQL操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节. ...
- mysql select 子查询_SELECT中常用的子查询操作
MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句.DML语句中也都会常用到子查询. 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中: 在 ...
- yii mysql条件查询_mysql – 在Yii2 find()/ QueryBuilder中使用WHERE条件的SELECT子查询
我能够找到子查询构建的简单示例,但是当我需要包含WHERE条件时,我无法弄清楚或找不到解决方案.我试图模拟以下声明-- SELECT ParentTable.*, (SELECT MAX(ChildT ...
- mybatis 一对多关系映射 select子查询 只有一条数据 解决方案
一般一对多 多的那个会是联合主键 所以要这么设置 <resultMap id="CfdMap" type="com.sxq.cloud.entity.ZhyyB2C ...
- mysql子查询的方式_分布式系统中一种迭代处理MYSQL子查询的方法
1.技术背景 1.1 背景技术 在分布式mysql中间件系统,DML语句中,子查询需要可能涉及到多个数据分片,如果在DML语句使用子查询,需要首先解析出子查询的具体内容,然后根据路由把子查询发往到各个 ...
- 用子查询的方法查找研发部比财务部所有雇员收入都高的雇员的姓名
第一遍: mysql> select 姓名 from employees-> where 编号 =-> (select 编号 from employees-> where 收入 ...
- java mysbatis select_MyBatis SELECT基本查询实现方法详解
1.返回一个LIST select * from tbl_employee where last_name like #{lastName} 2.将查询记录封装为一个Map select * from ...
- 数据库select的查询使用方法
常规查询 查询所有字段:select * from 表名; 查询指定字段:select 列1,列2,... from 表名; 使用 as 给字段起别名: select 字段 as 名字.... fro ...
- ResultTransformer deprecated 替代方案及HQL无法使用子查询解决
hibernate 由于从5.2升级成5.4 再用了ResultTransformer封装临时对象时sonar 报错,显示ResultTransformer 过时 官方在5.2版本中将此方法标记为过时 ...
最新文章
- 【思维导图】音乐为何会让我们产生特定情绪?
- GitHub、Git与TortoiseGit基本操作
- 三载春秋随风去,而今迈步从头越
- 机械设计软件编写心得
- spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式
- 江苏省计算机二级C操作题汇编
- ...............
- 吴琦:没有被“双非学历”困住的边界突破者
- 站在2018看单片机和嵌入式芯片方案选型和发展趋势
- 用npm安装yarn
- 计算机专硕一般研二在干嘛,专硕一般研二在干嘛,专硕两年怎么安排
- java商城源码视频教程_Java商城秒杀系统设计视频教程学习下载(含项目源码)...
- php打包签名apk文件在哪,Android_android应用签名详细步骤,1、准备工作apk的签名工作可以 - phpStudy...
- sublime插件之sidebar
- Sourcetree安装详细(最新版本)
- 走遍美国 —— 各州及其别名
- 利用手机实现计算机无线上网的设置过程,win10系统使用点对点无线网络实现手机共享上网的具体方案...
- 基于链表的多级菜单设计
- 系统(架构)设计五要素
- 2022-04-21 Omnet学习笔记(一)