Pour des données paginées, j'ai besoin de retourner le nombre total d'enregistrements correspondant à mes critères et les résultats de la première page. Cela est utile pour afficher des informations aux utilisateurs et calculer le nombre total de pages à attendre (du côté client).
actuellement, j'exécute la même requête deux fois, une fois pour le décompte total et une fois pour les enregistrements réels. J'espère qu'il existe un moyen plus efficace.
est-il possible de combiner ces deux requêtes en un seul appel à la base de données ?
le décompte :
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Long.class);
Root r = cq.from(VersionJpa.class);
Predicate p = cb.conjunction();
p = // some filtering code define by caller
cq.where(p);
cq.select(cb.count(r));
TypedQuery tq = em.createQuery(cq);
return tq.getSingleResult().intValue();
la page :
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(VersionJpa.class);
Root root = cq.from(VersionJpa.class);
Predicate p = cb.conjunction();
p = // same filtering code as in the count above
cq.where(p);
TypedQuery tq = em.createQuery(cq);
// pagination
tq.setFirstResults(first); // from caller
tq.setMaxResults(max); // from caller
return tq.getResultList();