hibernate 有没有什么方法可以使用JPQL的Size函数来绑定WHERE子句中的参数?

zsbz8rwp  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(119)

有没有什么方法可以使用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)的所有行。
有什么办法可以实现这一点吗?

mzsu5hc0

mzsu5hc01#

如果参数为空,或者只返回ID与参数匹配的项,则看起来您想返回所有内容。
正如它提到的here,这目前是不可能的,尽管您可能会对建议的workaround感兴趣。
有什么办法可以实现这一点吗?
就我个人而言,我会在Java端的服务类中执行此操作,调用SomeRepository.findAll()表示空集合,调用SomeRepository.findAllByIds()表示空集合。

zmeyuzjn

zmeyuzjn2#

是的,这件事很简单。仅当列表为非空时才将条件添加到查询中。使用JPA标准,您可以执行以下操作:

List<Integer> distributorIds = ...
if (!distributorIds.isEmpty()) {
    criteriaQuery.where(root.get("id").in(distributorIds));
}

在一个更大的查询中,您可以将单个Predicate对象收集到一个列表中,并最终设置它们的连接,该连接是通过CriteriaBuilder.and()创建的,作为WHERE子句 predicate 。

相关问题