Wählen Sie aus zwei Tabellen mit JPQL
Frage
Ich verwende JPQL
Daten abzurufen. Ich kann Daten mit der Anweisung bekommen
List persons = null;
persons = em.createQuery("select p.albumName from PhotoAlbum p , Roleuser r
where r = p.userId and r.userID = 1");
Jetzt kann ich die Albumnamen dieses:
int i=0;
for (i=0;i<persons.size(); i++)
{
System.out.println("Testing n "+ i +" " + persons.get(0));
}
Jetzt möchte ich den Namen des Albums bekommen und die Zeile namens firstname
der roleuser
Ich bin mit der Abfrage
persons = em.createQuery("select r.firstName , p.albumName from PhotoAlbum p ,
Roleuser r where r = p.userId and r.userID = 1").getResultList();
Nun, wie bekomme ich die Zeilen Vornamen und Albumnamen als persons.get (0) zurückgibt ein Objekt
durch den Code ausgeführt wird:
for (i=0;i<persons.size(); i++)
{
//r = (Roleuser) persons.get(i);
System.out.println("Testing n "+ i +" " + persons.get(i));
}
Ich erhalte diese:
Testing n 0 [Ljava.lang.Object;@4edb4077
INFO: Testing n 1 [Ljava.lang.Object;@1c656d13
INFO: Testing n 2 [Ljava.lang.Object;@46dc08f5
INFO: Testing n 3 [Ljava.lang.Object;@654c0a43
Wie kann ich die persons.get(0)
Karte und die firstname
und albumname
bekommen?
Lösung
Nun, wie gehen die Zeilen Vornamen und Albumname als persons.get (0) zurückgibt ein Objekt
Abfragen mit mehreren select_expressions in der SELECT-Klausel eine Object[]
zurückkehren (oder eine List
von Object[]
). Aus der JPA-Spezifikation:
4.8.1 Ergebnistyp der SELECT-Klausel
Der Typ des Abfrageergebnisses angegeben durch die SELECT-Klausel einer Abfrage ist ein Einheit abstrakter Schematyp, ein state-Feldtyp, das Ergebnis einer Aggregatfunktion, das Ergebnis eines Baubetrieb oder einige Folge davon.
Der Ergebnistyp der SELECT-Klausel wird durch die den Ergebnistypen definiert die select_expressions enthalten in es. wenn mehrere select_expressions ist in der SELECT-Klausel verwendet wird, ist das Ergebnis der Abfrage ist vom Typ
Object[]
und Elemente in diesem Ergebnis entspricht in Um zu der Reihenfolge ihres Spezifikation in der SELECT-Klausel und in Art der Ergebnistypen von jedem die select_expressions .
Also in Ihrem Fall, werden Sie wahrscheinlich so etwas wie dies wollen:
for (i=0;i<persons.size(); i++) {
//r = (Roleuser) persons.get(i);
System.out.println("Testing n " + i + " " + persons.get(i)[0] + ", " +
persons.get(i)[1]);
}
Beachten Sie, dass die Angabe eine innere Verknüpfung durch die Verwendung eines kartesisches Produkt in der FROM-Klausel und eine Join-Bedingung in der WHERE-Klausel weniger typisch als eine explizite Join über Entitätsbeziehungen Angabe (mit der [LEFT [OUTER] | INNER ] JOIN
Syntax). Sehen Sie den ganzen Abschnitt 4.4.5 Joins in der Beschreibung.
Referenzen
- JPA 1.0 Spezifikation
- Abschnitt 4.8.1 "Ergebnistyp der SELECT-Klausel"
- Abschnitt 4.8.2 "Constructor Ausdrücke in der SELECT-Klausel"
- Abschnitt 4.4.5 "Joins"