java - 如何在 Hibernate 中形成这个复杂的查询?

标签 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 .

因此该查询的结果将是一个列表,但不是 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/

相关文章:

java - Caused by : org. hibernate.MappingException: 实体映射中的重复列

java - 通过 JPA 条件查询从 SQL View 获取列表时出错

java - 集成 .net 和 java 应用程序的架构建议

java - Android Lollipop java.lang.SecurityException : Neither user nor current process has android. permission.BLUETOOTH_PRIVILEGED

java - 找到尽可能多的对

java - Hiber 缓存 : Cache all fixed data permanently

java - Ehcache与defaultCache?

java - 分离实体上的 JPA merge() 在存在时进行插入

java - 从数据库自动创建实体

java - 运行 tomcat 的 IntelliJ 生产力提示