欢迎来到天天文库
浏览记录
ID:47105204
大小:102.50 KB
页数:6页
时间:2019-08-04
《hibernate使用from (select ……)子查询的方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、今天徒弟用到了一句复杂的查询语句。。。。结果执行报错,但是在SQL中执行没有问题,于是来求助我了。。。语句的HQL/SQL格式如下:selectcount(1),cxltype,sum(dzsje),sum(iperson)from(selectxl.cxltype,g.iperson,(selectsum(y.dzsje)fromYsklistasywherey.cykpid=g.cregno)asdzsjefromGuestregasg,Xlasxlwhereg.xluuid=xl.uuid)astw
2、here……groupbyt.cxltype结果执行出错,最终发现,HQL无法支持from后面跟子查询的方式,网上查了N多资料,发现遇到这个问题的人还真是不少,但每一个相关的问题帖都没有满意的答复,甚至于多数都是没有跟帖的。。。。一阵心寒,hibernate叱咤风云,竟然对这个支持如此之弱?虽然这个语句可以通过另外的方法来做(比如建视图或者直接使用SQL来做),但总是不甘心,于是又开始查阅各处资料,最后找到了思路,觉得既然HQL不支持,那么只能把这种子查询封装为对象来做了,那么肯定是需要hbm配置这种临时
3、的子查询对象的,于是开始着手hbm配置的资料中查,hbm中配置对象的都是class标签,开始把范围缩小,针对hbm的class标签的属性资料开始翻查,找到了几个比较可能的属性,where、subselect、mutable、entity-bean,貌似这些都可能跟临时对象有关。。。于是反复尝试,并继续翻查资料最终在Hibernatereference3.2.0ga正式版中文参考手册中找到了一些比较可靠的资料:5.1.3.class你可以使用class元素来定义一个持久化类:4、sName"table="tableName"discriminator-value="discriminator_value"mutable="true5、false"schema="owner"catalog="catalog"proxy="ProxyInterface"dynamic-update="true6、false"dynamic-insert="true7、false"select-before-update="true8、false"polymorphism="implicit9、explicit10、"where="arbitrarysqlwherecondition"persister="PersisterClass"batch-size="N"optimistic-lock="none11、version12、dirty13、all"lazy="true14、false"entity-name="EntityName"check="arbitrarysqlcheckcondition"rowid="rowid"subselect="SQLexpression"abstract="true15、false"node="16、element-name"/>name(可选):持久化类(或者接口)的Java全限定名。如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。table(可选-默认是类的非全限定名):对应的数据库表名。discriminator-value(可选-默认和类名一样):一个用于区分不同的子类的值,在多态行为时使用。它可以接受的值包括null和notnull。mutable(可选,默认值为true):表明该类的实例是可变的或者不可变的。schema(可选):覆盖在根17、pping>元素中指定的schema名字。catalog(可选):覆盖在根元素中指定的catalog名字。proxy(可选):指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。dynamic-update(可选,默认为false):指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段。dynamic-insert(可选,默认为false):指定用于INSERT的SQL将会在运行时动态生成,并且只包含那些非空值字段。sele18、ct-before-update(可选,默认为false):指定Hibernate除非确定对象真正被修改了(如果该值为true-译注),否则不会执行SQLUPDATE操作。在特定场合(实际上,它只在一个瞬时对象(transientobject)关联到一个新的session中时执行的update()中生效),这说明Hibernate会在UPDATE之前执行一次额外的SQLSELECT操作,来决定是否应该执行UPDATE。poly
4、sName"table="tableName"discriminator-value="discriminator_value"mutable="true
5、false"schema="owner"catalog="catalog"proxy="ProxyInterface"dynamic-update="true
6、false"dynamic-insert="true
7、false"select-before-update="true
8、false"polymorphism="implicit
9、explicit
10、"where="arbitrarysqlwherecondition"persister="PersisterClass"batch-size="N"optimistic-lock="none
11、version
12、dirty
13、all"lazy="true
14、false"entity-name="EntityName"check="arbitrarysqlcheckcondition"rowid="rowid"subselect="SQLexpression"abstract="true
15、false"node="
16、element-name"/>name(可选):持久化类(或者接口)的Java全限定名。如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。table(可选-默认是类的非全限定名):对应的数据库表名。discriminator-value(可选-默认和类名一样):一个用于区分不同的子类的值,在多态行为时使用。它可以接受的值包括null和notnull。mutable(可选,默认值为true):表明该类的实例是可变的或者不可变的。schema(可选):覆盖在根17、pping>元素中指定的schema名字。catalog(可选):覆盖在根元素中指定的catalog名字。proxy(可选):指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。dynamic-update(可选,默认为false):指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段。dynamic-insert(可选,默认为false):指定用于INSERT的SQL将会在运行时动态生成,并且只包含那些非空值字段。sele18、ct-before-update(可选,默认为false):指定Hibernate除非确定对象真正被修改了(如果该值为true-译注),否则不会执行SQLUPDATE操作。在特定场合(实际上,它只在一个瞬时对象(transientobject)关联到一个新的session中时执行的update()中生效),这说明Hibernate会在UPDATE之前执行一次额外的SQLSELECT操作,来决定是否应该执行UPDATE。poly
17、pping>元素中指定的schema名字。catalog(可选):覆盖在根元素中指定的catalog名字。proxy(可选):指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。dynamic-update(可选,默认为false):指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段。dynamic-insert(可选,默认为false):指定用于INSERT的SQL将会在运行时动态生成,并且只包含那些非空值字段。sele
18、ct-before-update(可选,默认为false):指定Hibernate除非确定对象真正被修改了(如果该值为true-译注),否则不会执行SQLUPDATE操作。在特定场合(实际上,它只在一个瞬时对象(transientobject)关联到一个新的session中时执行的update()中生效),这说明Hibernate会在UPDATE之前执行一次额外的SQLSELECT操作,来决定是否应该执行UPDATE。poly
此文档下载收益归作者所有