您的位置:首页 > 其它

在Hibernate中实体对象映射优化(临时表映射)

2018-02-10 11:27 253 查看

在Hibernate中实体对象映射优化(临时表映射)

HQL语句无法做出细致的SQL优化,如何使用临时表映射一个临时表对象呢,其实就是相当简单的一句话(毕竟是Java)

/* 字符解释 */
Xxx - 表示VO对象


创建VO(Value Object,值对象)映射对象 - PostVO和VO是相似概念

fileNo,fileNum,recordDate三个成员变量(成员变量是指有get/set的全局变量)

★ 成员变量名必须和sql字段别名一致(区分大小写)

注意事项:设置get/set方法,默认构造函数

编写sql语句

String sql = "select d.fileNo fileNo, i.fileNum fileNum, d.recordDate recordDate from t_dossier d,t_inner i where d.id>50"


★ sql字段别名必须和成员变量名保持一致(区分大小写)

获取Query

Query query = XXXXXXXX.getCurrentSession().createSQLQuery(hql)
.addScalar("fileNo", StandardBasicTypes.STRING)
.addScalar("fileNum", StandardBasicTypes.LONG)
.addScalar("recordDate", StandardBasicTypes.DATE)
.setResultTransformer(Transformers.aliasToBean(DosserBean.class));


这里我是继承Dao层通用父类,可能和你们的实现语句不完全一致,但只要找到getCurrentSession()方法就可以了

- .addScalar("对象字段名",字段类型)


Xxx表示的是VO对象

查询

List<Xxx> listUser = query.list();


最后总结

对象映射只要掌握好成员变量名称以及构造方法即可,快去优化你的查询代码吧

PS:这里原来的SQL相当复杂,有兴趣的可以研究研究

select
re.dfileNo,count(re.ifileNo)
from
(select d.file_No dfileNo,i.file_No ifileNo,d.record_date
from
(select file_no,record_date
from t_dossier
where record_date between to_date('2018-2-6','yyyy-mm-dd') and to_date('2018-2-6','yyyy-mm-dd')) d,
t_Inner_Catalog i
where i.file_No like CONCAT(d.file_No,'-%')) re
group by re.dfileNo


作用是根据一个时间段查询这个档案号的文档数量,其中文档表和档案表只有file_no是有关联的,但是不全等(文档.file_no = (档案.file_no)-(文档编号))

效率很低,三分钟查询1000条数据(数据总量为200000)

这次发博客也主要是为了寻求帮助,有没有大神可以分享一下那种不需要添加新字段(比如说在文档中添加档案id字段)却能提高sql效率的语句

至此,感谢分享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息