2010-09-16 21 views
25

Pensé que sé cómo usar JOIN en JPQL pero aparentemente no. ¿Alguien puede ayudarme?JPA: UNIRSE a JPQL

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

Esto me dará Excepción

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

Users tienen una relación 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; 
} 

Mi segunda pregunta es dejar que dicen esta consulta devuelve un resultado único, entonces si lo hago

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

*** representan el nombre de la consulta anterior . Entonces, ¿fname y lname concatenados juntos dentro de temp o recibo un List<String>?

Respuesta

43

Ingreso en una-a-muchos relación en JPQL se ve de la siguiente manera:

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

Cuando varias propiedades se especifican en select cláusula, resultado se devuelve como Object[]:

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

Por cierto , por qué tus entidades se nombran en plural, es confuso. Si usted quiere tener nombres de tabla en plural, es posible utilizar @Table para especificar el nombre de la tabla para la entidad de forma explícita, por lo que no interfiere con las palabras reservadas:

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

¿Qué pasa si en lugar de seleccionar los campos que ha seleccionado una entidad + un campo de otra entidad. Algo como 'SELECCIONAR b, c.nombre ...'. Entonces, ¿el primer objeto en el Objeto [] va a ser un campo de by la entidad completa? – Ced

Cuestiones relacionadas