如何在Hibernate中构建这个复杂的查询?

时间:2014-05-26 09:52:28

标签: java hibernate jpa orm hql

我正在使用Hibernate,Spring HATEOAS和Jackson构建REST服务。我正在添加一个方法,该方法返回查询结果的JSON表示,如下所示;

SELECT ERRORS.DMN_NAM, CODES.MSG_TXT, 
  FROM SERV_ERR ERRORS, EVENT_CD CODES 
  WHERE ERRORS.SERV_RESP_CD_TXT = CODES.CD_TXT 
  GROUP BY ERRORS.DMN_NAM, ERRORS.SERV_NAM, CODES.MSG_TXT, 
    ERRORS.SERV_ERR_CNT, ERRORS.ERR_TS_NUM
  ORDER BY ERRORS.DMN_NAM, CODES.MSG_TXT

我目前定义了两个对象(ErrorsEntityEventCodeEntity),这些对象映射到表格SERV_ERREVENT_CD

因此,此查询的结果将是一个列表,但不是ErrorsEntityEventCodeEntity的结果,而是两个实体的合并。

到目前为止,我的查询都返回了直接映射到一个表的对象,如下所示:

public List<ErrorsEntity> getErrors(double daysPrevious, double hoursToShow);

在Hibernate中处理此问题的最佳方法是什么?查询结果不是映射到单个表的对象,如何在HQL中编写此查询?

1 个答案:

答案 0 :(得分:2)

最好坚持使用SQL查询,因为只有在计划从结果实体中更改状态时,HQL才有意义。在你的情况下,SQL是一个更好的选择,因为它并没有真正遵循标准,你只需要一个投影。您可以使用distinct删除组,但它需要一个派生表,无论如何都可以在纯SQL中完成。

List dtos = s.createSQLQuery(
"SELECT " + 
"   ERRORS.DMN_NAM AS dmnNam, " + 
"   CODES.MSG_TXT AS msgTxt " +
"FROM SERV_ERR ERRORS, EVENT_CD CODES " + 
"WHERE ERRORS.SERV_RESP_CD_TXT = CODES.CD_TXT " + 
"GROUP BY " + 
"   ERRORS.DMN_NAM, " + 
"   ERRORS.SERV_NAM, " + 
"   CODES.MSG_TXT, " + 
"   ERRORS.SERV_ERR_CNT, " + 
"   ERRORS.ERR_TS_NUM " +
"ORDER BY " + 
"   ERRORS.DMN_NAM, " + 
"   CODES.MSG_TXT "
  .addScalar("dmnNam")
  .addScalar("msgTxt")
  .setResultTransformer( Transformers.aliasToBean(MyDTO.class))
  .list();

确保YourDTO具有匹配的构造函数,类型与ee.dmn.nam和ece msgTxt完全相同。

而不是分组,我选择:

SELECT dmnNam, msgTxt  
FROM (
    SELECT DISTINCT 
         ERRORS.DMN_NAM AS dmnNam, 
         ERRORS.SERV_NAM, 
         CODES.MSG_TXT AS msgTxt, 
         ERRORS.SERV_ERR_CNT, 
         ERRORS.ERR_TS_NUM
    FROM SERV_ERR ERRORS, EVENT_CD CODES 
    WHERE ERRORS.SERV_RESP_CD_TXT = CODES.CD_TXT
    ORDER BY 
    dmnNam,
    msgTxt
) as DATA