【问题标题】:How to use CASE WHEN in Hibernate Where clause如何在 Hibernate Where 子句中使用 CASE WHEN
【发布时间】:2015-08-09 04:39:04
【问题描述】:

请举例说明如何在 HQL 中使用CASE WHEN

我在我的代码中使用了以下查询。

int receiptNumber = 100;
String hql = "SELECT b FROM OOPExtract as b "
                +"WHERE "
                +" b.tranStatId =" +receiptNumber+ " AND " 
                +" b.orderType IN ('EMERGENCY', 'PLENARY', 'PETITION','EXTENSION','MOTION') AND "
                +" CASE WHEN b.orderType == 'MOTION' " `enter code here`
                +  "THEN " 
                +" b.status = 'MOTION_SIGNED' " 
                +" ELSE " 
                +" b.status LIKE '%%'   " 
                +" END "        
                +" ORDER BY b.oopExtractId DESC";

但是当它运行时会产生以下异常

org.hibernate.hql.ast.QuerySyntaxException:意外令牌:= .....

【问题讨论】:

标签: java mysql hibernate hql


【解决方案1】:

我在一个工作项目中使用了以下查询。可以用作模板:)

"SELECT "
          + "CASE WHEN smth.status != 'BATMAN' THEN ... "
          + "ELSE (SELECT ... FROM ... WHERE ... ORDER BY ... DESC limit 1) "
          + "END, "
          + "next_field, "
          + "CASE WHEN smth.status == 'BATMAN' THEN ... "
          + "ELSE ... "
          + "END, "
          + "final_field_which_doesent_have_a_case_logic"
          + "FROM ... the_rest_of_the_normal_query";

【讨论】:

    【解决方案2】:

    这个也适用于 Hibernate 4/JPA 和 Spring 4!

    select
        limite 
    from
        Limite limite 
    join
        fetch limite.limiteEnqs enq 
    join
        fetch enq.limiteValors valor 
    where
        limite.id      = :limiteId 
        and   :dataReferencia between valor.dtIniVig and valor.dtFimVig 
        and enq.vrAtributo1 = case limite.atributoId1 
            when 8 then :produtoId 
            else enq.vrAtributo1 
        end 
    

    【讨论】:

      【解决方案3】:

      请试试这个。希望它有效。

                  "SELECT b FROM OOPExtract as b WHERE "
                  +" b.tranStatId =" +receiptNumber+ " AND " 
                  +" b.orderType IN ('EMERGENCY', 'PLENARY', 'PETITION','EXTENSION','MOTION') AND "
                  **+" CASE WHEN b.orderType 'MOTION' " `enter code here`
                  +  "THEN 'MOTION_SIGNED' " 
                  +" ELSE "** 
                  +" b.status LIKE '%%'   " 
                  +" END "        
                  +" ORDER BY b.oopExtractId DESC";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-21
        • 2022-08-08
        • 2019-01-10
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多