2010-09-16 7 views
25

Ich dachte, ich weiß JOIN in JPQL aber anscheinend nicht zu verwenden. Kann mir jemand helfen?JPA: JOIN in JPQL

select b.fname, b.lname from Users b JOIN Groups c where c.groupName = :groupName 

mir diese Ausnahme

org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query 
Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException 

Users eine OneToMany Beziehung mit Groups haben geben.

Users.java

@Entity 
public class Users implements Serializable{ 

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL) 
    List<Groups> groups = null; 
} 

Groups.java

@Entity 
public class Groups implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="USERID") 
    private Users user; 
} 

Meine zweite Frage lassen sich sagen, diese Abfrage ein eindeutiges Ergebnis zurück, dann, wenn ich

String temp = (String) em.createNamedQuery("***") 
    .setParameter("groupName", groupName) 
    .getSingleResult(); 

*** den Namen die Abfrage oben darstellen . Also macht fname und lname miteinander verkettet innerhalb temp oder ich bekomme eine List<String> zurück?

Antwort

43

Mitglied wird auf einer Eins-zu-viele-Beziehung in JPQL sieht wie folgt aus:

select b.fname, b.lname from Users b JOIN b.groups c where c.groupName = :groupName 

Wenn mehrere Eigenschaften in select-Klausel angegeben werden, das Ergebnis wird zurückgegeben, wie Object[]:

Object[] temp = (Object[]) em.createNamedQuery("...") 
    .setParameter("groupName", groupName) 
    .getSingleResult(); 
String fname = (String) temp[0]; 
String lname = (String) temp[1]; 

By the way , warum deine Entitäten im Plural benannt sind, ist es verwirrend. Wenn Sie Tabellennamen in Plural haben wollen, können Sie @Table verwenden die Tabellennamen für die Einheit explizit angeben, damit es nicht mit reservierten Worten stören:

@Entity @Table(name = "Users")  
public class User implements Serializable { ... } 
+1

Was passiert, wenn statt Felder auswählen, die Sie eine Einheit ausgewählt + ein Feld von einer anderen Entität. Etwas wie 'SELECT b, c.name ...'. Dann wird das erste Objekt im Objekt [] ein Feld von b oder der gesamten Entität sein? – Ced