Union All und Sum mit JPA CriteriaBuilder
Ich versuche zu konvertieren native-SQL-Abfrage, die Kriterien API in der JPA 2.0. Ich habe eine Menge von Kriterien API-Beispiele auf Google, aber ich habe eine wirklich harte Zeit setzen alle Stücke zusammen. Ich hoffe, dass eine erfahrene person wird in der Lage sein, mir zu helfen. Die native query sieht wie folgt aus:
select
sum(amount) from firstTable, secondTable
where firstTable.id = secondTable.id
and amount <> 0
and firstTable.id = ?
union all
select
sum(amount) from firstTable, thirdTable
where firstTable.id = thirdTable.id
and amount <> 0
and firstTable.id = ?
Original Abfrage-Ergebnis Satz wurde wieder eine Liste von BigDecimal-Objekten.
Danke!
Ich hatte das gleiche problem zu lösen, mit dieser könnte ich die union stackoverflow.com/a/55302501/5486945
InformationsquelleAutor user1148956 | 2012-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
JPA unterstützt nicht die UNION, verwenden Sie entweder eine native SQL-Abfrage, oder führen Sie zwei Abfragen.
EclipseLink unterstützt UNION wiki.eclipse.org/EclipseLink/UserGuide/JPA/...
InformationsquelleAutor James
Sorry das folgende Beispiel ist nicht union, sondern Sie ist auch eine Verknüpfung.
Ich würde erwägen, Abfrage mit mehreren Wurzeln.
Hier ist ein Ausschnitt aus dem Hiberante developer guide, der code ist JPA 2.0-kompatibel.
Kriterien Abfragen definieren können mehrere Wurzeln, die Wirkung zu erzeugen ein Kartesisches Produkt zwischen den neu hinzugefügten root und die anderen. Hier ist ein Beispiel, passend für alle single-Männer und alle single-Frauen:
@user613114: ich habe nicht verwendet ORM und Java für mehrere Jahre, aber ich werde versuchen Sie zu beantworten. Das obige Beispiel, geben Sie alle möglichen Kombinationen von single-Mann und single-Frau. Die SQL-Abfrage wird wie folgt Aussehen: wählen Sie eine.name b.Namen von PERSONEN ein, die PERSONEN b, wo ein.Geschlecht = 'Männlich' und b.Geschlecht = 'weiblich' und ein.status = single-und b -.status = single
InformationsquelleAutor Alex
Wenn Sie brauchen, Union All, dann zwei Entitäten als Kandidaten gelten der Vererbung, um Sie in meinem Kopf.
InformationsquelleAutor Marcin Cinik
Marcin stellte fest, es ist möglich, mit Vererbung, zumindest in speziellen Fällen.
Wenn Sie machen können abgefragt Personen Erben, die der eine vom anderen mit TABLE_PER_CLASS-Vererbung-Strategie (sofern Optional möglich in den Ruhezustand, aber Einschränkungen gibt es - Sie können nicht mit IDENTITÄT und AUTO) und wenn das Feld in der Abfrage den gleichen Namen in beiden Entitäten, dann können Sie vereinen beide Elemente durch Abfrage der Eltern.
Wenn zum Beispiel entity-Klasse, Kind erstreckt sich von der entity-Klasse, Eltern-beide mit Feld "name", Abfrage wäre :
select p.Namen von Übergeordneten p
Wählen Sie nur die Namen der Übergeordneten Körperschaften Bedingung hinzufügen mit TYP.
select p.Namen von Übergeordneten p-TYP(p) = Parent
Ändern, wenn Personen zu Erben eines von einem anderen unangemessen ist, Sie können spezielle (mit Vererbung, der Ursache) für diese Abfrage, da es möglich ist, erstellen Sie mehrere Personen für die gleiche Tabelle. Aber Sie nicht wahrscheinlich finden, dass der Aufwand zumutbar ist.
InformationsquelleAutor Alex