当前位置: 首页 > 知识库问答 >
问题:

使用WHERE中的“CASE-WHEN”语句进行查询导致QuerySyntaxException:意外的AST

吕志诚
2023-03-14

我试图使用Spring Data进行查询,但我无法使其工作:

@Query(SELECT t FROM Thing t WHERE name LIKE :name AND CASE WHEN (:minVal <= 0) THEN TRUE ELSE (val <= :minVal) END AND CASE WHEN (:maxVal <= 0) THEN TRUE ELSE (val >= :maxVal) END)
Page<Thing> getThings(@Param("name") String name, @Param("maxVal") int maxVal, @Param("minVal") minVal); 

堆栈跟踪:

原因:java。lang.IllegalArgumentException:org。冬眠hql。内部的ast。QuerySyntaxException:意外的AST节点:第1行第49列附近的CASE[从Thing t中选择t,其中name LIKE:name和CASE WHEN(:minVal

原因:组织。冬眠hql。内部的ast。QuerySyntaxException:意外的AST节点:第1行第49列附近的CASE[从Thing t中选择t,其中name LIKE:name和CASE WHEN(:minVal

我之所以使用它,是因为我想至少使用五个过滤器进行更长的查询,并且我想简化进行不同查询的过滤器组合的工作。

不知道是否有其他(更好)方法来做我想做的事,如果有,很高兴听到。

谢谢你。

编辑:使用本机查询工作正常,但与分页不兼容。。。

共有1个答案

申屠秦斩
2023-03-14

当Hibernate直接返回布尔文本时,它似乎无法计算CASE表达式的结果。解决方法是使CASE表达式成为另一个表达式的一部分,例如,将其与另一个布尔文本进行比较。

所以代替:

... AND CASE WHEN (:minVal <= 0) THEN TRUE ELSE (val <= :minVal) END

尝试:

... AND (CASE WHEN (:minVal <= 0) THEN TRUE ELSE (val <= :minVal) END) = TRUE

但是看看这个表达式,难道不更简单一些吗:

... AND (:minVal <= 0 OR val <= :minVal)

这不是等价的吗?

 类似资料:
  • 问题内容: 我只想获取一个表“ b”的值,如果表“ a”的值是“-”如果表“ b”的值是空的,那么即使它是“-”,也要获取表“ a”的值 Microsoft Access对以下查询说“ Missing operator”: 我认为该错误是在CASE表达式行上。 问题答案: MS Access不支持语句。用途: 我不确定Access是否支持别名,但是它可能支持 注意(尽管标签正确),问题的标题可能会

  • 问题内容: 是否可以执行这样的mysql查询? 我需要在一般的“ where”子句中使用子查询的结果。 问题答案: 您可以将其包装在子查询中,如下所示:

  • 问题内容: 第一次查询 该查询工作正常,引擎没有抱怨 第二查询 这是行不通的,引擎在抱怨,当-根据我-当我在做完全相同的事情时 有人看到引擎为什么对第一个查询不满意时抱怨第二个查询吗? 提前致谢, 问题答案: CASE期望标量单一值。没有记录集。 或者 另一种选择是使用IF

  • 在Spring Boot应用程序中,我们使用queryDSL访问数据库。应用程序将打印表中匹配(用户输入依赖)搜索参数的所有项。 null 类似于 和一个类似于 (这个示例远没有我们实际的应用程序代码复杂,但它应该足以证明我们的问题。) 我们在Oracle DB(12.*)和Ignite(2.7)上的SQL控制台中手动运行该语句。在Oracle上一切正常,Ignite仍然宣布我们将出现语法错误/不

  • 问题内容: 以下是我当前的SELECT CASE语句: 我并不总是想重复版本=’xxx’的条件,例如 在Excel中,这相当容易,但是如何在PostgreSQL中进行编译呢? 问题答案: 试试这个

  • 问题内容: 在SQL Server 2005上,我正在尝试查询此选择语句 它返回下面的错误 消息156,级别15,状态1,第4行关键字“ IN”附近的语法错误。 请给我一些有关我的代码可能出问题的建议。 问题答案: 应该只是。 您正在混合表达式的2种形式。