Sono nuovo in JPA e voglio implementare un DAO JPA generico e ho bisogno di trovare il numero di righe di un set di risultati di una query per implementare l'impaginazione. Dopo aver cercato sul Web, non riesco a trovare un modo pratico per farlo. Ecco il codice suggerito in molti articoli:Come contare il numero di righe di un CriteriaQuery JPA 2 in un DAO JPA generico?
public <T> Long findCountByCriteria(CriteriaQuery<?> criteria) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);
Root<?> entityRoot = countCriteria.from(criteria.getResultType());
countCriteria.select(builder.count(entityRoot));
countCriteria.where(criteria.getRestriction());
return em.createQuery(countCriteria).getSingleResult();
}
Tuttavia, questo codice non funziona quando si utilizza join
. Esiste un modo per contare le righe di un set di risultati della query utilizzando l'API dei criteri JPA?
UPDATE: qui è il codice che creano CriteriaQuery:
CriteriaQuery<T> queryDefinition = criteriaBuilder.createQuery(this.entityClass);
Root<T> root = queryDefinition.from(this.entityClass);
e alcuni join può essere aggiunto alla radice finché la query è stata eseguita:
public Predicate addPredicate(Root<T> root) {
Predicate predicate = getEntityManager().getCriteriaBuilder().ge(root.join(Entity_.someList).get("id"), 13);
return predicate;
}
e l'eccezione generata è ad esempio:
org.hibernate.hql.ast.QuerySyntaxException: percorso non valido: 'generatedAlias1.id' [select count (generatedAlias0) da entity.Entity come generatedAlias0 dove (generatedAlias0.id> = 13L) e ( (generatedAlias1.id < = 34L))]
che generatedAlias1 dovrebbe essere su Entity e generateAlias0 dovrebbe essere sull'associazione a cui mi sono iscritto. Nota che implemento Join in modo corretto perché quando eseguo query senza conteggio, la query viene eseguita senza errori e Join funziona correttamente ma quando provo a eseguire query di conteggio genera un'eccezione.
Puoi mostrarci come hai definito CriteriaQuery > criteri – perissf
@perissf Ho aggiornato il post. – stacker
Dai un'occhiata ad altre risposte a problemi simili: http://stackoverflow.com/questions/9001289/jpa-hibernate-criteriabuilder-how-to-create-query-using-relationship-object/9002225#9002225 e http: // stackoverflow.com/questions/9025196/how-to-use-jpa-criteria-api-when-joining-many-tables/9025656#9025656 – perissf