web-dev-qa-db-fra.com

JPA 2 CriteriaQuery, en utilisant une limite

J'utilise JPA 2. Pour des raisons de sécurité, je travaille en sécurité avec CriteriaQuery (et par conséquent, je ne cherche aucune solution aux requêtes dactylographiées, etc.).

Je suis récemment tombé sur un problème dans lequel je devais définir un SQL-LIMIT.

Après de nombreuses recherches, je n’étais toujours pas parvenu à trouver une solution.

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

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

Quelqu'un peut-il m'aider?

55
Menno

Définissez limite et offset sur le Query :

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

De la documentation:

TypedQuery setFirstResult (int startPosition)

Définit la position du premier résultat à récupérer. Paramètres: startPosition - position du premier résultat, numéroté à partir de 0

TypedQuery setMaxResults (int maxResult)

Définissez le nombre maximal de résultats à récupérer.

133
Francisco Spaeth

Par souci d'exhaustivité, je souhaite répondre à la question initiale relative à l'API JPA Criteria.

Tout d'abord , vous pouvez préciser vous-même quand utiliser JPQL et quand utiliser l'API Criteria en fonction du cas d'utilisation. Il existe un article de Nice sur ce sujet sur le site documentation ObjectDB qui déclare:

L’utilisation de l’API de critères présente un avantage majeur: les erreurs peuvent être détectées plus tôt, lors de la compilation plutôt que lors de l’exécution. Par ailleurs, pour de nombreux développeurs, les requêtes JPQL basées sur des chaînes, très similaires aux requêtes SQL, sont plus faciles à utiliser et à comprendre.

Je recommande cet article en général, car il décrit de manière concise comment utiliser l'API JPA Criteria. Il existe un article similaire à propos de API de requête .

Retour à la question :

Un CriteriaQuery offre un ensemble de restrictions accessibles, par exemple, à l'aide de la méthode where(). Comme vous pouvez le deviner intuitivement: vous ne pouvez pas limiter la requête à un nombre particulier de résultats avec une telle restriction - sauf que vous avez un cas trivial, comme la limitation d'un identifiant unique (ce qui rendrait l'utilisation de l'API Criteria obsolète). Expliqué simplement: une limite n'est pas un critère et n'est donc pas couverte par cette api. Voir aussi le vieux mais or docs Java EE pour plus de détails.

Solution

Cependant, vous pouvez bien sûr utiliser votre objet CriteriaQuery comme base d'une requête JPQL. Donc, tout d’abord, vous créez votre CriteriaQuery tel quel:

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

Ensuite, utilisez le constructeur JPA Query pour les objets CriteriaQuery:

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

Et c’est essentiellement ainsi que vous devriez utiliser les deux API en fonction de la documentation et des articles fournis.

6
Kekzpanda