Je pensais savoir comment utiliser JOIN
dans JPQL
mais apparemment pas. Quelqu'un peut-il m'aider?
select b.fname, b.lname from Users b JOIN Groups c where c.groupName = :groupName
Cela me donne une exception
org.Eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query
Internal Exception: org.Eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException
Users
ont une relation OneToMany avec 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;
}
Ma deuxième question est de dire que cette requête renvoie un résultat unique, alors si je le fais
String temp = (String) em.createNamedQuery("***")
.setParameter("groupName", groupName)
.getSingleResult();
***
représente le nom de la requête ci-dessus. fname
et lname
sont également concaténés dans temp
ou j'obtiens un List<String>
retour?
Rejoignez la relation un-à-plusieurs dans JPQL:
select b.fname, b.lname from Users b JOIN b.groups c where c.groupName = :groupName
Lorsque plusieurs propriétés sont spécifiées dans la clause select
, le résultat est renvoyé sous la forme Object[]
:
Object[] temp = (Object[]) em.createNamedQuery("...")
.setParameter("groupName", groupName)
.getSingleResult();
String fname = (String) temp[0];
String lname = (String) temp[1];
Soit dit en passant, pourquoi vos entités sont nommées au pluriel, c'est déroutant. Si vous souhaitez avoir des noms de table au pluriel, vous pouvez utiliser @Table
pour spécifier explicitement le nom de table de l'entité, afin qu'il n'interfère pas avec les mots réservés:
@Entity @Table(name = "Users")
public class User implements Serializable { ... }