with two tables query manytomany many ejemplos ejemplo column java jpa eclipselink jpql

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