JPA: UNIRSE en JPQL


Pensé que sabía cómo usar JOIN en JPQL pero aparentemente no. ¿Alguien puede ayudarme?

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

Esto me da una 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 tener una relación OneToMany con 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 digamos que esta consulta devuelve un resultado único, entonces si lo hago

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

*** representa el nombre de la consulta anterior. Así lo hace fname y lname concatenado dentro de temp o me sale un List<String> ¿volver?

Author: Nicolas Filotto, 2010-09-17

1 answers

Join on one-to-many relation in JPQL se ve de la siguiente manera:

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

Cuando se especifican varias propiedades en la cláusula select, el 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é sus entidades se nombran en forma plural, es confuso. Si desea tener nombres de tabla en plural, puede usar @Table para especificar el nombre de tabla para la entidad explícitamente, para que no interfiera con las palabras reservadas:

@Entity @Table(name = "Users")     
public class User implements Serializable { ... } 
 48
Author: axtavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-22 16:31:46