如何计算子查询返回的行数?

Pio*_*otr 15 jpa jpql criteria-api jpa-2.0

我想做这样的事情:

select count(*) from (select ...)
Run Code Online (Sandbox Code Playgroud)

(就像在SQL中一样),但在JPA中.

关于我将如何做的任何想法?

Bal*_*usC 26

我偶然发现了这个问题.我最终想执行以下JPQL:

SELECT COUNT(u)
FROM (
   SELECT DISTINCT u
   FROM User u
   JOIN u.roles r
   WHERE r.id IN (1)
)
Run Code Online (Sandbox Code Playgroud)

但这不可能,也不是标准API.研究表明,这只是JPA中的设计限制.JPA规范声明子查询仅在WHEREHAVING子句中受支持(因此不在其中FROM).

使用以下JPQL格式重写查询:

SELECT COUNT(u)
FROM User u
WHERE u IN (
   SELECT DISTINCT u
   FROM User u
   JOIN u.roles r
   WHERE r.id IN (1)
)
Run Code Online (Sandbox Code Playgroud)

使用JPA Criteria API,如下所示:

CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<User> u = query.from(User.class);
Subquery<User> subquery = query.subquery(User.class);
Root<User> u_ = subquery.from(User.class);
subquery.select(u_).distinct(true).where(u_.join("roles").get("id").in(Arrays.asList(1L)));
query.select(cb.count(u)).where(cb.in(u).value(subquery));
Long count = entityManager.createQuery(query).getSingleResult();
// ...
Run Code Online (Sandbox Code Playgroud)

解决了我的功能需求.这也应该为您提供足够的洞察力来解决您的特定功能需求.


pka*_*nen 9

这应该成功(如果你想使用JPA标准API):

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();  
CriteriaQuery<Long> query = cb.createQuery(Long.class);

Root<Entity> root = query.from(Entity.class);

//Selecting the count
query.select(cb.count(root));

//Create your search criteria
Criteria criteria = ...

//Adding search criteria   
query.where(criteria);

Long count = getEntityManager().createQuery(query).getSingleResult();
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想使用JP-QL,下面的代码可以做到这一点:

//Add the where condition to the end of the query
Query query = getEntityManager().createQuery("select count(*) from Entity entity where...")
Long count = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)

  • 这根本不能回答具体问题.OP询问如何计算子查询的结果,而不是如何计算查询的结果. (12认同)
  • 问题是我想获取子查询返回的行数。看来这是不可能的,因为不能像在JPA中那样使用子查询 (2认同)