java - two - JPA: UNIRSE en JPQL
jpql join two tables (1)
Únase a la relación uno a muchos 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 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é tus entidades son nombradas en forma de plural, es confuso. Si desea tener nombres de tablas en plural, puede usar @Table para especificar el nombre de la tabla para la entidad explícitamente, para que no interfiera con las palabras reservadas:
@Entity @Table(name = "Users")
public class User implements Serializable { ... }
Pensé que sé 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 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 de 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 dejar que esta consulta arroje un resultado único, entonces si lo hago
String temp = (String) em.createNamedQuery("***")
.setParameter("groupName", groupName)
.getSingleResult();
*** representa el nombre de la consulta anterior. Entonces, ¿ fname y lname concatenan juntos dentro de la temp o recibo una List<String> ?