Wie Sie richtig feststellen, ob ein "existiert" JPA Criteria-Query-Klausel zurückgegeben wahr oder falsch?
Ich weiß nicht, wie führen Sie eine JPA-criteria-Abfrage zurückgibt, die mit einer booleschen Ausgang.
Ziel ist ein Kriterien-Abfrage, die so aussieht wie diese beim Rendern in Oracle:
select 1 from dual where exists ( ... );
Den where exists (...)
Teil I, durchgeführt mit einer Unterabfrage. Ich habe Mühe mit der externen Abfrage.
Der praktische nutzen dieser ist, um zu bestimmen, ob diese Unterabfrage in der exists
- Klausel gibt true
oder false
.
Dies ist, was ich geschrieben habe:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Object> query = criteriaBuilder.createQuery();
query.from(Boolean.class);
query.select(criteriaBuilder.literal(true));
Subquery<Location> subquery = query.subquery(Location.class);
Root<Location> subRootEntity = subquery.from(Location.class);
subquery.select(subRootEntity);
Path<?> attributePath = subRootEntity.get("State");
Predicate predicate = criteriaBuilder.equal(attributePath, criteriaBuilder.literal("TX"));
subquery.where(predicate);
query.where(criteriaBuilder.exists(subquery));
TypedQuery<Object> typedQuery = em.createQuery(query);
Die Letzte Zeile gibt eine Fehlermeldung, die besagt, dass "Boolean ist eine Entität". Ich denke mein Problem ist nicht zu wissen, wie um den Ausdruck des "von" - Teil der Abfrage, so dass das Ergebnis Ausgänge 1 oder 0/wahr oder falsch - nicht ein Unternehmen.
Ich weiß, konnte ich wieder jede Einheit und prüfen Sie dann, ob die Liste der Ergebnisse hat die Größe von 1.
Bin ich Fragen, wie man ein Boolesches Ergebnis, beide zu vermeiden, die unnötige Aufgabe zum abrufen der Spalten und auch zu lernen, wie es zu tun.
Ist dies überhaupt möglich?
Dank!
Eduardo
- Nein, Sie können nicht direkt zu tun, aber ein gemeinsamer Weg ist zu prüfen, für die Anzahl der Ergebnismenge ich.e wenn die Zählung größer als null ist, dann true, sonst false.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie tun, ein wählen Sie für eine Eigenschaft (z.B. die ID) und legen Sie die maximale Ergebnisse zu 1, so dass Sie sicherstellen, dass die DB nicht mehr Arbeit als nötig (wie zählen alle Instanzen). Dann Ihre Ergebnisse Liste ist entweder leer (exists = false) oder ein element (exists = true).
Ja, das ist möglich. Angenommen, Sie haben ein Unternehmen entsprechend Ihrem
dual
Tabelle, die Sie verwenden möchten, werden die entity-Klasse inCriteriaQuery#from
.Hibernate 5 arbeitet:
Ich weiß, dies ist eine ältere Frage, aber für jemand anderes suchen: Wie zu versuchen, zu verwenden, Spring jpa @annotation und Abfrage eine select-case-Abfrage (je nach db-Implementierung) mit einer Methode, die einen booleschen Wert zurückgibt. Zum Beispiel (MySQL):
Manchmal auch nur mit den query-string in @Query kann ein Lebensretter sein, wenn die benannte JPA oder den Abfrage-generator-Methoden nicht ganz das tun, was Sie wollen.
count()
, das ist das grundlegende problem. Hibernate unterstützt nicht dieexists
keyword-außer in denwhere
Klausel, die nicht erreichen, was der OP fordert. Die Auswahl einescount
potenziell extrem langsam (abhängig von der Komplexität derwhere
Klausel, Vorhandensein von Indizes, etc.) während einexists
Klausel wird schnell scheitern auf das erste auftreten. Es ist wirklich eine Schande, JPA/Hibernate unterstützt nicht diese triviale Optimierung.Ich denke, das problem ist die Abfrage.aus(Boolean.class). Es versucht, eine "wähle Objekt aus "boolean" Abfragen. Wenn Sie möchten, dass ein boolean als return-Typ, den Sie verwenden müssen,
Dann-Abfrage von jedem vorhandenen entity-Tabelle zu erstellen, die eine gültige Abfrage, die (vielleicht aus der Unterabfrage die Tabelle). Ich denke nicht, dass das erstellen von dual funktioniert, außer wenn Sie es geschafft, die Karte dual-Tabelle.
Gibt es einen Grund, dass alle die Logik in JPA? Wenn nicht, warum nicht WÄHLEN Sie zu ZÄHLEN und dann eine bedingte um die boolean?