45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:怎么样使用NativeSQL在hibernate中处理临时表?

怎么样使用NativeSQL在hibernate中处理临时表?

2016-08-29 17:32:50 来源:www.45fan.com 【

怎么样使用NativeSQL在hibernate中处理临时表?

目前在使用hibernate做项目,遇到了一个问题:在查询一个产品列表数据时,需要从另外的数据统计表中获得相关统计数据。同时,统计表中的数据也非简单获取,而是要进行一定的条件查询和计算,这样就不得不使用到临时表,这个问题相信遇到的人不在少数

我在网上查到的信息,有人说应该规避这个问题,不使用临时表。
这显然不现实。实际应用中很多情况都是在查询一个列表时,需要同时查询很多其他信息,很多情况下需要使用临时表。如果不使用临时表,完全按照对象来写,会严重影响效率。

有人说使用NativeSQL来处理,我认为方向是对的,可惜没给出比较好的示例,只能自己尝试
总算试通,就写出来,希望能对需要的人有所帮助


数据表:详细的就不说了,说一下几个主要的部分

表1: 产品信息表,包含多个属性字段

表2: 销售统计表
字段: 产品编码 产品的编码
数量 统计数据
月份 统计月份
客户 相关客户

销售量的统计是按产品、月份和客户进行统计的,但查询时需要将某产品一段时间内所有的销售数量统计出来

正常的SQL为:
select p.产品编码,p.字段1,p.字段2 [,...p.字段n]
from 产品信息表 p left outer join
(select sum(数量),产品编码 from 销售统计表 group by 产品编码 where [月份条件]) st on st.产品编码=p.code


NativeSQL:
需要写两个映射文件:
产品信息表 Product的映射,没啥好说的

销售统计表 Stat的映射有个问题,其实也是唯一的问题:
NativeSQL中不管你的select子句怎么写,hibernate似乎都是要访问映射文件中的所有字段
举个例子:如果映射文件中把上述Stat的四个字段都映射了,就算你在SQL中只写
select st.产品编码 as {st.model},st.数量 as {st.quantity}
hibernate也会试图获取月份和客户的信息,于是报错,告诉你“invalid column name”,“月份16_1”或者“客户16_1”找不到
这个“月份16_1”或者“客户16_1”就是hibernate给“月份”和“客户”取的别名

在上述逻辑下,又不能select {st.*},否则group by 就有问题了
所以Stat的映射文件只要写两个字段:产品编码和数量就行了,这样写select {st.*}就没问题了

所以NativeSQL就成了这样:

select {p.*},{st.*}
from 产品信息表 p left outer join
(select sum(数量) as 数量,产品编码 from 销售统计表 group by 产品编码 where [月份条件]) st on st.产品编码=p.产品编码

SQLQuery sq = getSession().createSQLQuery(hql.toString());
sq.addEntity("p",Product.class);
sq.addEntity("st",Stat.class);

运行通过


从NativeSQL可以看出,hibernate根本不管你临时表的子查询里怎么写,只要最后的查询结果能够正常映射就可以了
所以Stat的映射其实就是临时表结果字段的一个映射,只不过是借用了“销售统计表”而已
从临时表子查询中可以看到,由于Stat已经映射了“产品编码”字段,所以查询结果字段中的“产品编码”不需要写别名
但是sum(数量)就必须取别名,把它对应到“数量”字段上去

如果上述有错误或者有其他更好的解决类似问题的方法,请一定告诉我

 

 

本文地址:http://www.45fan.com/a/question/69469.html
Tags: 处理 hibernate NativeSQL
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部