0
votes

Comment joindre deux entités avec une relation ManyToMany dans la requête jpa

J'ai deux entités User et Role . Chaque utilisateur peut avoir plusieurs rôles.

Classe d'utilisateurs

@Override
public List<User> getArtists() {
   return em.createQuery(
      "from User u, Role r where u.roles='4'",
      User.class
   ).getResultList();
}

Classe de rôle:

@Entity
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    private String name;
}

Ainsi, une nouvelle table jointe est en cours de création appelée: user_role entrez la description de l'image ici

Je veux créer une requête pour renvoyer une liste d'utilisateurs avec role_id de 4, par exemple. La requête que j'ai déjà essayée:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(
            name = "user_role",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles = new HashSet<>();
}

Comment puis-je corriger cette requête afin de récupérer une liste d'utilisateurs avec role_id de 4?


0 commentaires

3 Réponses :


0
votes

Peut-être que vous pouvez consulter le sujet suivant, les réponses données à l'intérieur pointent dans le même sens que votre question: Requête JPA sur une table de jointure


1 commentaires

Cela n'est donc possible qu'avec entityManager.createNativeQuery? N'est-ce pas possible avec em.createQuery?



1
votes

Vous pouvez faire quelque chose comme ceci:

List<User> users = em.createQuery(
   "select distinct u from User u join fetch u.roles rl where rl.id = :id",
    User.class)
.setHint( QueryHints.HINT_PASS_DISTINCT_THROUGH, false )
.setParameter("id", 1L)
.getResultList();

Le QueryHints.HINT_PASS_DISTINCT_THROUGH est ajouté en tant QueryHints.HINT_PASS_DISTINCT_THROUGH supplémentaire des performances . Mais veuillez noter que cette optimisation ne fonctionnera qu'avec hibernate 5.2.2.Final ... 5.2.11.Final. Il a été cassé dans le 5.2.12.Final.


0 commentaires

0
votes

Si j'étais vous, j'aurai l'avantage d'utiliser SpringdataJpa avec hibernate et utiliserai simplement cette déclaration: Si vous ne voulez pas utiliser de requête:

    public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findByRoles_Id(Long id);
}

Dans votre référentiel d'utilisateurs:

List<User> findByRoles_Id(Long id);


2 commentaires

Pour clarifier cela, c'est SpringDataJPA, pas JPA


Merci pour vos commentaires @ACV :)