有没有什么方法可以使用JPQL的SIZE
函数来绑定WHERE
子句中的变量?
大概是这样的:
and (size(:distributor_ids) = 0 or d.id in (:distributor_ids))
Hibernate抛出以下异常:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unexpected expression ? found for collection function size
我的查询非常大,但这个AND子句非常简单:如果列表为空,则检索所有内容;如果列表不为空,则检索符合d.id IN (:distributor_ids)
的所有行。
有什么办法可以实现这一点吗?
2条答案
按热度按时间mzsu5hc01#
如果参数为空,或者只返回ID与参数匹配的项,则看起来您想返回所有内容。
正如它提到的here,这目前是不可能的,尽管您可能会对建议的workaround感兴趣。
有什么办法可以实现这一点吗?
就我个人而言,我会在Java端的服务类中执行此操作,调用
SomeRepository.findAll()
表示空集合,调用SomeRepository.findAllByIds()
表示空集合。zmeyuzjn2#
是的,这件事很简单。仅当列表为非空时才将条件添加到查询中。使用JPA标准,您可以执行以下操作:
在一个更大的查询中,您可以将单个
Predicate
对象收集到一个列表中,并最终设置它们的连接,该连接是通过CriteriaBuilder.and()
创建的,作为WHERE子句 predicate 。