我正在使用 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 中编写此查询?
最佳答案
那么最好坚持使用 SQL 查询,因为只有当您计划更改结果实体的状态时,HQL 才有意义。就您而言,SQL 是一个更好的选择,因为它并不真正遵循标准,而且您只需要一个投影。您可以使用 unique 删除 group by ,但它需要一个派生表,无论如何都可以用普通 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
关于java - 如何在 Hibernate 中形成这个复杂的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23867435/