¿Cómo contar el número de filas devueltas por la subconsulta?

Quiero hacer algo como esto:

select count(*) from (select ...)

(Como sería en SQL), pero en JPA.

Alguna idea sobre cómo iba a hacerlo?

OriginalEl autor Piotr | 2011-03-24

2 Kommentare

  1. 11

    Esto debe hacer el truco (Si desea utilizar JPA criterios 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();

    Por otro lado, si desea utilizar JP-QL, el código siguiente debe hacer el truco:

    //Add the where condition to the end of the query
    Query query = getEntityManager().createQuery("select count(*) from Entity entity where...")
    Long count = query.getSingleResult();
    El problema es que yo quería para obtener el número de filas devueltas de una subconsulta. Parece que no es posible porque las subconsultas no puede ser usado como tal en JPA
    Esto no contesta a la pregunta concreta. El OP está preguntando cómo contar los resultados de una subconsulta, no cómo contar los resultados de una consulta.

    OriginalEl autor pkainulainen

  2. 23

    Me topé con este problema. Me gustaría, en última instancia, para ejecutar las siguientes JPQL:

    SELECT COUNT(u)
    FROM (
       SELECT DISTINCT u
       FROM User u
       JOIN u.roles r
       WHERE r.id IN (1)
    )

    Pero esto no era posible, también no con los criterios de la API. La investigación enseñado que esto era sólo una limitación de diseño en JPA. La especificación JPA estados que subconsultas sólo se admiten en WHERE y HAVING cláusulas (y por lo tanto no en el FROM).

    La reescritura de la consulta en los siguientes JPQL forma:

    SELECT COUNT(u)
    FROM User u
    WHERE u IN (
       SELECT DISTINCT u
       FROM User u
       JOIN u.roles r
       WHERE r.id IN (1)
    )

    usando JPA API de Criterios como la siguiente:

    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();
    //...

    ha resuelto el requisito funcional para mí. Esto también se debe de tener suficiente comprensión de la solución de su particular requisito funcional.

    usted no puede usar este método si desea contar resultado de la agregación de consulta
    ¿Qué enfoque le sugeriría a DISTINTAS CONTAR desde arbitraria CriteriaQuery?
    He encontrado ninguna solución efectiva, sólo para devolver todas las filas y el número de ellos en el servidor de aplicaciones.
    En ese caso, creo que la única opción es ir a la llanura de JDBC consulta.

    OriginalEl autor BalusC

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea