我正在使用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
我目前定义了两个对象(ErrorsEntity
和EventCodeEntity
),这些对象映射到表格SERV_ERR
和EVENT_CD
。
因此,此查询的结果将是一个列表,但不是ErrorsEntity
或EventCodeEntity
的结果,而是两个实体的合并。
到目前为止,我的查询都返回了直接映射到一个表的对象,如下所示:
public List<ErrorsEntity> getErrors(double daysPrevious, double hoursToShow);
在Hibernate中处理此问题的最佳方法是什么?查询结果不是映射到单个表的对象,如何在HQL中编写此查询?
答案 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