我必须使用 jpa 查询来计算所有存在的对象。因此,我需要查询中集合中的 id 计数。 这是存储库代码:
public interface ProductRepository extends PagingAndSortingRepository<Product, String>, JpaSpecificationExecutor<Product> {
@Query("SELECT CASE WHEN COUNT(p.id) = COUNT ( :ids )THEN true ELSE false END " +
"FROM Product p WHERE p.id IN :ids")
boolean existsProductsByIdIn(Set<String> ids);
}
在上面的代码中COUNT(:ids)不起作用。 我也尝试过使用 SIZE (:ids)。
注意:我不想将尺寸作为参数传递。
解决方案如下:
您遇到的问题是因为 JPA 不支持在 JPQL 中直接计算集合参数。相反,您可以使用本机 SQL 查询来实现此目的。如果您想坚持使用 JPQL,则需要将大小作为单独的参数传递(您提到过您不想要)。
但是,有一个使用
INDEX
函数的 JPQL 解决方法:
public interface ProductRepository extends PagingAndSortingRepository<Product, String>, JpaSpecificationExecutor<Product> {
@Query("SELECT CASE WHEN COUNT(p) = (SELECT MAX(INDEX(id)) FROM Product p1 WHERE p1.id IN :ids) + 1 THEN true ELSE false END " +
"FROM Product p WHERE p.id IN :ids")
boolean existsProductsByIdIn(Set<String> ids);
}
通过这种方法,我们假设
:ids
集的索引中没有间隙。 + 1
是因为 INDEX
是从 0 开始的。此解决方案应该为您提供所需的结果,而不需要本机 SQL 或单独传递大小。