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

问题描述 投票:0回答:1

我必须使用 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)

注意:我不想将尺寸作为参数传递。

spring spring-boot jpa jpql
1个回答
0
投票

解决方案如下:

您遇到的问题是因为 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 或单独传递大小。

© www.soinside.com 2019 - 2024. All rights reserved.