如何编写用于处理可选输入参数的HQL查询

时间:2017-05-16 16:09:09

标签: java sql hibernate hql

incomingData

我正在尝试编写一个HQL查询,该查询具有值为a,b,c和d的可选输入。

我的目标是让查询识别输入=''然后只是移动1 = 1基本上什么都不做。

我一直在收到错误 antlr.NoViableAltException:意外令牌:=

首先,错误令牌是“CASE”,现在是“=”。

“1 = 1方法”是否可行? 我可以在HQL中使用这样的CASE语句吗?

谢谢

更新后的尝试:

 @Query("SELECT c FROM message c" 
       +" WHERE (CASE WHEN a=''    THEN 1=1 ELSE a= :a"
       + "           WHEN b=''     THEN 1=1 ELSE b= :b"
       + "           WHEN c=''     THEN 1=1 ELSE c= :c"
       + "           WHEN d=''     THEN 1=1 ELSE d= :d)")

1 个答案:

答案 0 :(得分:1)

您确定要使用JPQL执行此操作吗? 我建议你使用Query By ExampleQueryDSL

如果您想继续使用JPQL,请提前阅读:P

如果要使用条件运算符,可以在sPEL内使用@Query。以下是基于您的要求的示例查询。

@Query("SELECT C FROM Message C " +
       "WHERE 1=1 " +
       "AND ((1=:#{ #param1 == null ? 1 : 0 }) OR (C.param1 = :#{#param1})) " +
       "AND ((1=:#{ #param2 == null ? 1 : 0 }) OR (C.param2 = :#{#param2})) " +
       "AND ((1=:#{ #param3 == null ? 1 : 0 }) OR (C.param3 = :#{#param3})) " +
       "AND ((1=:#{ #param4 == null ? 1 : 0 }) OR (C.param4 = :#{#param4})) "
)
List<Message> find(@Param("param1") Long param1, @Param("param2") Long param2,@Param("param3") Long param3, @Param("param4") Long param4);

一个小解释

  1. 第一个条件1=1:呵呵,痴迷于WHERE子句下一行的条件,你可以删除它。
  2. ((1=:#{ #param1 == null ? 1 : 0 }) OR (C.param1 = :#{#param1})):Crazzy !!
    第一部分将决定是否检查第二部分。假设param1为null,则(1=:#{ #param1 == null ? 1 : 0 })将返回1=1,并且会跳过(C.param1 = :#{#param1})
  3. 同样适用于其他条件。
  4. 如果您有任何疑问,请随时发表评论。

    BTW,您应该使用与JPQL内对象相关的字段。例如C.param1而不仅仅是param1