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

版权声明: https://blog.csdn.net/taotaojs/article/details/79303901

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

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

/* 字符解释 */
Xxx - 表示VO对象
  1. 创建VO(Value Object,值对象)映射对象 - PostVO和VO是相似概念

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

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

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

  2. 编写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字段别名必须和成员变量名保持一致(区分大小写)

  3. 获取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对象

  4. 查询

    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效率的语句

至此,感谢分享

猜你喜欢

转载自blog.csdn.net/taotaojs/article/details/79303901