2010-09-16 4 views
25

Ho pensato di sapere come utilizzare JOIN in JPQL ma apparentemente no. Qualcuno può aiutarmi?JPA: JOIN in JPQL

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

Questo mi darà Eccezione

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

Users hanno un rapporto con OneToMany Groups.

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; 
} 

La mia seconda domanda è diciamo questa query restituisce un risultato unico, quindi se lo faccio

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

*** rappresentano il nome query di cui sopra . Così fa fname e lname concatenati insieme all'interno di temp o ottengo un List<String> indietro?

risposta

43

registrazione su uno-a-molti relazione in JPQL appare come segue:

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

Quando diverse proprietà sono specificate in select clausola, risultato viene restituito come Object[]:

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

Tra l'altro , perché le tue entità sono nominate al plurale, è confusa. Se si vuole avere i nomi di tabella al plurale, è possibile utilizzare @Table per specificare il nome della tabella per l'entità in modo esplicito, in modo da non interferire con le parole riservate:

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

Che cosa succede se invece di selezionare i campi è stato selezionato un soggetto + un campo da un'altra entità. Qualcosa come "SELECT b, c.name ...". Quindi il primo oggetto nell'oggetto [] sarà un campo di b o l'intera entità? – Ced