如何在JPA查询中获取列表的计数?

ecr0jaav  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(60)

我必须使用jpa查询来计数所有存在的对象。所以,我需要从我的查询集合中的id计数。以下是Repository代码:

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);

}

在上面的代码中,blog(:ids)不起作用。我也试过使用SIZE(:ids)

**注意:**我不想把大小作为参数传递。

64jmpszr

64jmpszr1#

解决方案如下:
您遇到的问题是因为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或单独传递大小。

1tuwyuhd

1tuwyuhd2#

你不觉得这可能会给予你同样的结果吗?

COUNT(p.id) = COUNT(DISTINCT p.id )

您正在比较输入的SET值,这些值只是查询中的不同值。如果您将比较总id与不同id,您可能会得到所需的结果。

SELECT CASE WHEN COUNT(p.id) = COUNT(DISTINCT p.id ) THEN true ELSE false END " +
            "FROM Test p  WHERE p.id IN :ids

相关问题