首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在WHERE原因QuerySyntaxException:意外AST中使用"CASE“语句进行查询

在WHERE原因QuerySyntaxException:意外AST中使用"CASE“语句进行查询
EN

Stack Overflow用户
提问于 2014-09-07 12:44:09
回答 1查看 9.9K关注 0票数 4

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

代码语言:javascript
代码运行次数:0
运行
复制
@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); 

StackTrace:

由: org.hibernate.hql.internal.ast.QuerySyntaxException:意外java.lang.IllegalArgumentException节点引起:在第1行附近列49从t中选择t,例如:名称和大小写时(:minVal <= 0),然后选择TRUE <= (val <= :minVal)结束,大小写时(:maxVal <= 0),然后选择TRUE ELSE (val >= :maxVal)结束于org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:331) at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:334) at com.sun.Proxy$Proxy83.createQuery(未知来源).repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:78) .再来207个 由: org.hibernate.hql.internal.ast.QuerySyntaxException:意外的AST节点引起:情况接近第1行,列49从t中选择t,例如:名称和大小写时(:minVal <= 0),然后选择TRUE <= (val <= :minVal)结束,大小写时(:maxVal <= 0),然后选择TRUE ELSE (val >= :maxVal)结束于org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl( org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java ):190)在org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)

我之所以这样做,是因为我希望至少使用五个筛选器进行更长的查询,并且我希望简化进行不同查询的筛选组合的工作。

不知道是否有一种不同的(更好的)方式来做我想做的事,如果是的话,很高兴听到它。

谢谢。

编辑:使用本机查询很好,但不兼容分页.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-07 16:36:42

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

因此,与其:

代码语言:javascript
代码运行次数:0
运行
复制
... AND CASE WHEN (:minVal <= 0) THEN TRUE ELSE (val <= :minVal) END

尝试:

代码语言:javascript
代码运行次数:0
运行
复制
... AND (CASE WHEN (:minVal <= 0) THEN TRUE ELSE (val <= :minVal) END) = TRUE

但看看这句话,这样做不是更简单吗?

代码语言:javascript
代码运行次数:0
运行
复制
... AND (:minVal <= 0 OR val <= :minVal)

这不是等同的吗?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25710317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档