2016-03-21 14 views
1

Ich habe zwei Tabellen: Benutzer und Rolle in ManyToMany-Beziehung.ManyToMany wählen Abfrage in JPA2 (JPQL)

@Entity 
@Table(name = "user") 
public class User implements Serializable { 

    @Id 
    @Column(name = "user_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long userId; 

    @ManyToMany 
    @JoinTable(name = "user_role", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "role_id")) 
    private Set<Role> roles; 

//getters, setters 
} 

und

@Entity 
@Table(name = "role") 
public class Role implements Serializable { 

    @Id 
    @Column(name = "role_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long roleId; 

    @Column(name = "role_code") 
    private String roleCode; 


    @ManyToMany(mappedBy = "roles") 
    @JsonIgnore 
    private Set<User> users; 

//getters,setters 

} 

Ich möchte alle Benutzer auswählen und alle seine Rollen, wenn Benutzerrolle haben zum Beispiel ‚ROLE_USER‘.

Ich habe es in nativen SQL, aber ich möchte JPQL oder CriteriaQuery verwenden.

ich in JPQL versucht (Wechsel früher Abruftyp EAGER becouse in Unterabfrage kann ich nicht holen JOIN):

public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) { 
    Query q = em.createQuery("select u from User u join fetch u.roles r WHERE u.userId in (SELECT uu.userId FROM User uu join uu.roles rr WHERE rr.roleCode like :roleName)") 
      .setParameter("roleName", roleName) 
      .setFirstResult(startNumber) 
      .setMaxResults(endNumber); 
    return q.getResultList(); 
} 

und es funktioniert, wie ich will, aber ist es möglich, ohne Fetching Typ EAGER Ändern ? Vielen Dank für Ihre Antwort.

+0

Dies funktioniert nicht? 'Wählen Sie u aus dem Benutzer u verbinden fetch u.roles join u.roles r WHERE r.roleCode wie: roleName'. Wenn es für Sie funktioniert, beantworte ich die Frage mit weiteren Details zum jpql. – Dherik

+0

Ja, es funktioniert jetzt, danke – Emeres

Antwort

0

Sie tun können:

public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) { 
    Query q = em.createQuery("select u from User u join fetch u.roles join u.roles r WHERE r.roleCode like :roleName") 
      .setParameter("roleName", roleName) 
      .setFirstResult(startNumber) 
      .setMaxResults(endNumber); 
    return q.getResultList(); 
}