【问题标题】:request working on SQL/oracle but not on java Hibernate HQL请求在 SQL/oracle 上工作,但不在 java Hibernate HQL 上工作
【发布时间】:2018-08-16 17:26:03
【问题描述】:

我有以下在 oracle 中可以正常工作的请求:

SELECT SUM(col1_sum + col2_sum + col3_sum) AS sum_total FROM ( 
   SELECT 
      COUNT(CASE WHEN (col1 != 0) THEN 1 END) AS col1_sum, 
      COUNT(CASE WHEN (col2 IS NULL) THEN 1 END) AS col2_sum, 
      COUNT(CASE WHEN (col3 IS NULL OR col 3 < 0) THEN 1 END) AS col3_sum 
    FROM myTable)
;

它根据我的所有条件返回正确的总和

但是当我把它翻译成这样的 HQL 时:

@Query("SELECT SUM(col1_sum + col2_sum + col3_sum) AS sum_total FROM ( "
   +"SELECT "
   +" COUNT(CASE WHEN (col1 != 0) THEN 1 END) AS col1_sum, "
   +" COUNT(CASE WHEN (col2 IS NULL) THEN 1 END) AS col2_sum, "
   +" COUNT(CASE WHEN (col3 IS NULL OR col 3 < 0) THEN 1 END) AS col3_sum "
   +"FROM myTable)")

我可以毫无错误地编译我的项目,但是当我启动它时,我从休眠中收到以下错误:

2018-03-08 11:18:54.485 [NO_USER NO_SESSION] ERROR o.h.h.i.a.ErrorCounter : line 1:96: unexpected token: ( antlr.NoViableAltException: unexpected token: ( at org.hibernate.hql.internal.antlr.HqlBaseParser.fromRange(HqlBaseParser.java:1544) [....] Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 96 [...]

显然休眠不会在第一行的FROM ( 之后重新调整我的查询

有什么方法可以正确地将我的 Oracle/SQL 请求转换为 Hibernate/HQL 吗?

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    使用 SQL 而不是 HQL 的本机查询的 Hibernate 注释是 @NamedNativeQuery,而不是 @Query。

    【讨论】:

      【解决方案2】:

      这是因为 Hibernate 不支持 FROM 子句中的子查询。参考讨论Cannot use subqueries in from clause. Is there an alternativ

      您可能需要使用允许您传递 Native SQL 的@NamedNativeQuery,这样您就可以在 FROM 子句中使用子查询,或者看到您在 FROM 子句中重写查询而不使用子查询。

      【讨论】:

        【解决方案3】:

        感谢您的回答,我找到了一种不使用 @NamedNativeQuery 的方法。我已经重构了我的 SQL 查询,显然现在 Hibernate 可以正确理解它。

        现在,在我的 java 代码中,查询看起来像:

        @Query("SELECT ((COUNT(CASE WHEN (col1 != 0) THEN 1 END)) + "
                + "(COUNT(CASE WHEN (col2 IS NULL) THEN 1 END)) + "
                + "(COUNT(CASE WHEN (col3 IS NULL OR col3 < 0) THEN 1 END))) AS total "
                + "FROM myTable")
        

        这很好用。 我认为问题不在于我的 requset 中的子查询(我有其他带有子查询的请求可以正常工作),而是“SUM”关键字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多