Ich bin ziemlich neu in JPA 2 und es ist CriteriaBuilder / CriteriaQuery API:
CriteriaQuery
im Java EE 6 Tutorial
Ich möchte die Ergebnisse einer CriteriaQuery zählen, ohne sie tatsächlich abzurufen. Ist das möglich, habe ich keine solche Methode gefunden, der einzige Weg wäre dies zu tun:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
Und das kann nicht der richtige Weg sein ...
Gibt es eine Lösung?
java
jpa-2.0
criteriaquery
Sean Patrick Floyd
quelle
quelle
Antworten:
Eine Abfrage vom Typ
MyEntity
wird zurückgegebenMyEntity
. Sie möchten eine Abfrage für aLong
.Natürlich möchten Sie Ihren Ausdruck mit den Einschränkungen und Gruppierungen usw. aufbauen, die Sie im Beispiel übersprungen haben.
quelle
qb.count
dies überRoot<MyEntity>
Ihre Abfrage (Root<MyEntity>
myEntity = cq.from (MyEntity.class)) erfolgt und dies häufig bereits in Ihrem normalen Auswahlcode enthalten ist und wenn Sie vergessen, dass Sie sich selbst verbinden.Ich habe dies mit cb.createQuery () (ohne den Parameter für den Ergebnistyp) geklärt:
Ich hoffe es hilft :)
quelle
quelle
Da andere Antworten korrekt, aber zu einfach sind, stelle ich der Vollständigkeit halber das folgende Code-Snippet vor, um
SELECT COUNT
eine anspruchsvolle JPA-Kriterien-Abfrage (mit mehreren Verknüpfungen, Abrufen, Bedingungen) durchzuführen .Diese Antwort wurde leicht geändert .
Hoffe, es spart jemandem Zeit.
Weil die IMHO JPA Criteria API weder intuitiv noch gut lesbar ist.
quelle
recursion on databases
? Ich habe über Rekursion auf API-Ebene gesprochen. Verwechseln Sie diese Konzepte nicht :-) JPA wird mit einer sehr leistungsstarken / komplexen API geliefert, mit der Sie mehrere Verknüpfungen / Abrufe / Aggregationen / Aliase usw. in einer einzigen Abfrage ausführen können. Sie müssen sich beim Zählen damit auseinandersetzen.Abhängig von der von Ihnen verwendeten JPA 2-Implementierung ist dies etwas schwierig. Diese funktioniert für EclipseLink 2.4.1, jedoch nicht für den Ruhezustand, hier eine generische CriteriaQuery-Anzahl für EclipseLink:
Neulich bin ich von EclipseLink in den Ruhezustand migriert und musste meine Zählfunktion auf die folgende ändern. Sie können sie also auch verwenden, da dies ein schwer zu lösendes Problem ist. Es funktioniert möglicherweise nicht für Ihren Fall, da es seit dem Ruhezustand verwendet wird 4.x, beachte, dass ich nicht versuche zu erraten, welches die Wurzel ist, sondern es von der Abfrage übergebe, damit das Problem gelöst ist, zu viele mehrdeutige Eckfälle, um zu versuchen zu erraten:
quelle
Sie können auch Projektionen verwenden:
quelle
Mit Spring Data Jpa können wir diese Methode verwenden:
quelle