web-dev-qa-db-fra.com

JPA: JOIN dans JPQL

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?

35
Thang Pham

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 { ... } 
59
axtavt