我试图使用Spring数据进行查询,但无法使其工作:
@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)
我之所以这样做,是因为我希望至少使用五个筛选器进行更长的查询,并且我希望简化进行不同查询的筛选组合的工作。
不知道是否有一种不同的(更好的)方式来做我想做的事,如果是的话,很高兴听到它。
谢谢。
编辑:使用本机查询很好,但不兼容分页.
发布于 2014-09-07 16:36:42
当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)
这不是等同的吗?
https://stackoverflow.com/questions/25710317
复制相似问题