JPA 2 CriteriaQuery, usando un límite


Estoy usando JPA 2. Por razones de seguridad, estoy trabajando tipo seguro con CriteriaQuery (y por lo tanto, no estoy buscando ninguna solución a las consultas mecanografiadas y así sucesivamente).

Recientemente me encontré con un problema en el que necesitaba establecer un LÍMITE SQL.

Después de muchas búsquedas, todavía no tuve éxito en encontrar una solución.

CriteriaQuery<Product> query = getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = query.from(Product.class);
query.select(product);

return em.createQuery(query).getResultList();

¿Alguien puede ayudarme?

Author: Bilesh Ganguly, 2012-07-25

2 answers

Define limit y offset en la consulta :

return em.createQuery(query)
         .setFirstResult(offset) // offset
         .setMaxResults(limit) // limit
         .getResultList();

De la documentación:

TypedQuery setFirstResult (int StartPosition)

Establece la posición del primer resultado a recuperar. Parámetros: StartPosition - posición del primer resultado, numerada desde 0

TypedQuery setMaxResults (int maxResult)

Establezca el número máximo de resultados a recuperar.

 114
Author: Francisco Spaeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 23:26:50

En aras de la exhaustividad, quiero responder a la pregunta inicial con respecto a la API de Criterios de JPA.

En primer lugar , puede aclarar por sí mismo de antemano cuándo usar JPQL y cuándo usar la API de Criterios dependiendo del caso de uso. Hay un buen artículo sobre esto en el ObjectDB documentation sitio web que dice:

Una gran ventaja de usar la API de criterios es que los errores se pueden detectar antes, durante la compilación en lugar de en tiempo de ejecución. Por otro lado, para muchos desarrolladores las consultas JPQL basadas en cadenas, que son muy similares a las consultas SQL, son más fáciles de usar y entender.

Recomiendo este artículo en general porque describe concisamente cómo usar la API de criterios de JPA. Hay un artículo similar sobre la API de consultas .

Volver a la pregunta :

A CriteriaQuery ofrece un conjunto de restricciones que son accesibles, por ejemplo, mediante el método where(). Como usted puede ser que intuitivamente conjetura: no puede limitar la consulta a un número particular de resultados con tal restricción, excepto que tiene un caso trivial como limitar un identificador único (lo que haría que el uso de la API de Criterios sea obsoleto). Simplemente explicado: un límite no es un criterio y, por lo tanto, no está cubierto por esa api. Ver también el viejo pero oro Java EE docs para más detalles.

Solución

Sin embargo, por supuesto, puede usar su objeto CriteriaQuery como un base para una consulta JPQL. Así que primero, crea su CriteriaQuery como es:

CriteriaQuery<Product> criteriaQuery = 
    getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = criteriaQuery.from(Product.class);
criteriaQuery.select(product);

Luego use el constructor JPA Query para CriteriaQuery objetos:

Query limitedCriteriaQuery = getEntityManager().createQuery(criteriaQuery)
     .setMaxResults(resultLimit); // this is the important part     
return limitedCriteriaQuery.getResultList();

Y así es básicamente como debe usar ambas API de acuerdo con la documentación y los artículos proporcionados.

 3
Author: Kekzpanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 13:30:49