java - 如何编写 HQL 查询来处理可选输入参数

标签 java sql hibernate hql

 @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)")

我正在尝试编写一个 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 a = :a"
               + "    WHEN b != ''   THEN b = :b"
               + "    WHEN c != ''   THEN c = :c"
               + "    WHEN d != ''   THEN d = :d)"

antlr.NoViableAltException: unexpected token: WHEN
antlr.NoViableAltException: unexpected token: a
antlr.NoViableAltException: unexpected token: THEN

最佳答案

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

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

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

@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})):太疯狂了!!
    第一部分将决定是否检查第二部分。假设 param1 为 null(1=:#{ #param1 == null ? 1 : 0 }) 将返回 1=1(C.param1 = :#{#param1}) 将被跳过。
  3. 同样适用于其他条件。

如果您有任何疑问,请随时发表评论。

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

关于java - 如何编写 HQL 查询来处理可选输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44006499/

相关文章:

java - 为什么 Quartz 作业没有被执行(尽管 QUARTZ 表正在使用正确的作业详细信息进行更新)

java - 不使用 Maven 运行简单的 Spring 批处理作业?

java - 外观模式和抽象工厂模式有什么区别?

java - 如何将 scala.collection.immutable.List[scala.collection.mutable.MutableList[String]] 转换为 java.util.List[java.util.List[String]]

java 相当于 perl URI::QueryParam 模块

mysql - 一个查询在另一个查询中输出执行

sql - Flutter - SQLite 死锁只是在应用程序的第一次运行中

sql - mysql从多行中选择数据

hibernate - c3p0 创建的连接数多于配置中指定的连接数

java - 如何创建无操作 Hibernate Criteria 限制