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>
?