Warum wieder die Klasse übergeben?
In Kriterien API-Abfrage Komponenten werden durch Objekte dargestellt. So select
Klausel und die from
Klausel durch Objekte dargestellt:
Die select
Klausel wird wie folgt dargestellt:
CriteriaQuery<Pilot> critQuery = critBuilder.createQuery(getEntityClass());
Die Pilot
Klasse in der obigen Linie stellt den Rückgabetyp des Abfrageergebnisses.
Und auf der anderen Seite der from
-Klausel der Abfrage wie folgt definiert ist:
final Root<Pilot> root = critQuery.from(getEntityClass());
In diesem Beispiel sowohl die Root
und CriteriaQuery
zufällig den gleichen Typen. Dies gilt jedoch nicht für alle Abfragen. In einigen Abfragen möchten Sie möglicherweise ein oder mehrere Attribute aus der Abfrage zurückgeben (aber nicht alle Attribute der Entitäten, die an einer Abfrage beteiligt sind). In diesen Fällen unterscheidet sich der Typ, den Sie in CriteriaQuery
angeben, von dem Typ, den Sie in Root
verwenden. Angenommen, Sie haben ein name
Attribut in Ihrer Pilot
Entität und Sie sind nur an der Liste der Namen der Pilot
Entitäten interessiert.
CrtieriaQuery<String> cq = cb.createQuery(String.class);
Aber die Definition der Root
nicht ändert, in Ihrem Beispiel: In diesem Fall Ihre CriteriaQuery
werden wie folgt definiert werden.
NICHT VORHANDEN Ausdruck
Lage sein, Ihre not in
expresion zu not exists
Form konvertieren Sie eine Unterabfrage mit dem IDs zu formulieren haben. Hier ein Auszug aus der JPA-Spezifikation:
Ein EXISTS-Ausdruck ist ein Prädikat, das nur dann wahr ist, wenn das Ergebnis der Unterabfrage aus einem oder mehreren Werten besteht und andernfalls falsch ist. Die Syntax eines existiert Ausdruck
exists_expression :: = [NOT] EXISTS (Unterabfrage) Natürlich muss dies auf die Kriterien API übersetzt werden, wobei in diesem Fall die Syntax
wird nicht (existiert (Unterabfrage)). Hier
ist ein Beispiel für eine Unterabfrage zu schaffen (Pseudocode):
Subquery<Integer> sq = critQuery.subquery(Integer.class);
Root<Pilot> pilot = sq.from(Pilot.class);
sq.select(pilot.<Integer>get("id"));
sq.where(<some_condition>);
Vielleicht Duplikat mit http://stackoverflow.com/questions/13859780/building-a-query-using-not -exists-in-jpa-Kriterien-api – Moolerian