JPA 2.0: count beliebigen CriteriaQuery?
Ich versuche zu implementieren ist die folgende convenience-Methode:
/**
* Counts the number of results of a search.
* @param criteria The criteria for the query.
* @return The number of results of the query.
*/
public int findCountByCriteria(CriteriaQuery<?> criteria);
Im Ruhezustand, diese erfolgt durch
criteria.setProjection(Projections.rowCount());
Was ist das äquivalent zu der oben in JPA? Ich fand zahlreiche einfache Zählung Beispiele, aber keiner von Ihnen machte den Einsatz einer CriteriaQuery, dessen Zeilenanzahl ermittelt werden soll.
EDIT:
Ich leider herausgefunden, dass @Pascal s Antwort ist nicht die richtige. Das problem ist sehr subtil und nur zeigt, wenn Sie joins verwenden:
//Same query, but readable:
//SELECT *
//FROM Brain b
//WHERE b.iq = 170
CriteriaQuery<Person> query = cb.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
Join<Object, Object> brainJoin = root.join("brain");
Predicate iqPredicate = cb.equal(brainJoin.<Integer>get("iq"), 170);
query.select(root).where(iqPredicate);
Beim Aufruf findCountByCriteria(query)
, es stirbt mit der folgenden Ausnahme:
org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.iq' [select count(generatedAlias0) from xxx.tests.person.dom.Person as generatedAlias0 where generatedAlias1.iq=170]
Gibt es eine andere Möglichkeit, einen solchen CountByCriteria
Methode?
- Wo Sie in der Lage, eine Lösung zu finden? Ich bin an der gleichen Kreuzung, und nicht wissen, wie Sie Vorgehen. Danke.
- Ich bin ziemlich sicher, es ist nicht möglich, nachdem alle.
- Offenbar ist es möglich, nachdem alle. Finden Sie Jose Luis Martin ' s Antwort. Ich habe nicht versucht es, aber es sieht aus wie die wahre Lösung für mich.
- Vielen Dank für das heads-up, einen Blick auf Sie, wenn ich kommen Sie zurück, um es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrieb ich eine utility-Klasse, JDAL JpaUtils, es zu tun:
Long count = JpaUtils.count(em, criteriaQuery);
JpaUtils.copyCriteria(em, criteriaQueryFrom, criteriaQueryTo);
CriteriaQuery<Long> countCriteria = JpaUtils.countCriteria(em, criteria)
und so weiter...
Wenn Sie interessiert sind, in den source-code finden Sie in JpaUtils.java
Habe ich sortiert diese aus mit dem cb.createQuery() (ohne die Ergebnis-Typ-parameter):
Hoffe es hilft 🙂
Was ich getan habe, ist so etwas wie ein Baumeister der einen CriteriaBuilder, wo können Sie eine Abfrage erstellen, und rufen Sie die Liste() oder count() mit den gleichen Kriterien Einschränkungen
Sind Sie auf der Suche nach so etwas?
Die Sie verwenden, wie diese:
PS: ich weiß nicht, ob das der richtige/beste Weg, um dies zu implementieren, immer noch lernen, die Kriterien API...
Die ganze Idee von Kriterien Abfragen ist, dass Sie sind stark typisiert. Also jede Lösung, wo Sie sind mit raw-Typen (ohne generics in CriteriaQuery oder Root oder Root) - diese Lösungen sind gegen, die wichtigste Idee. Ich habe gerade laufen in das gleiche Problem, und ich bin kämpfen, um es zu lösen in einem "richtigen" (zusammen mit JPA2) Weg.
Keine der oben genannten Lösungen arbeiten, die für EclipseLink 2.4.1, Sie alle am Ende mit einem Zähler auf ein Kartesisches Produkt (N^2), hier ein kleiner hack für EclipseLink, der einzige Nachteil ist, dass ich nicht weiß, was passieren wird, wenn Sie die Auswahl AUS mehr als einer Person, wird es versuchen, zu zählen ab dem 1. gefunden Stammverzeichnis des CriteriaQuery, diese Lösung funktioniert NICHT für den Ruhezustand, obwohl (JDAL tut, aber JDAL nicht funktioniert, EclipseLink)
wenn Sie möchten, das Ergebnis und die Anzahl aller Elemente wie Spring Data Seite-Element, das Sie tun können, zwei Anfragen. Was Sie tun können, ist die Trennung der Kriterien in der Abfrage-Ausführung.
Beispiel zu finden, die Benutzer von Stadt
addiional der getUser-Methode können Sie erstellen eine zweite, die zählen, Ihre Elemente
und die createConditions Methode behandeln, so dass Sie nicht haben, duplizieren Sie Ihre Logik für die Kriterien.
in Ihrem Controller können Sie etwas tun, wie
lange elementCount = yourCriteriaClassInstance.getElementCount(...);
Benutzer auflisten = yourCriteriaClassInstance.getUsers(...)
ich tun somethig, wie Dank diesem mit hibernate und Kriterien api
}
Hoffnung Hilfe