2017-10-16 5 views
0

je les classes suivantes disposées comme si:comment écrire une requête hql pour la relation hibernate OneToMany?

class User { 
    @Id 
    private long id; 

    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL) 
    Set<UserRole> userRoles; 
} 

class UserRole { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    private int id; 

    @Column(name = "role", nullable = false, length = 45) 
    private String role; 
    } 

Je tente d'interroger pour les utilisateurs qui ont un rôle spécifique (dans ce cas, tous les utilisateurs avec le ROLE_ADMIN rôle), en utilisant la requête suivante:

org.hibernate.query.Query<User> userQuery=session.createQuery("from User as mc where mc.userRoles in (from UserRole as ur where ur.role in (:uRoles))",User.class); 
    Set<String> roles = new HashSet<String>(); 
    roles.add("ROLE_ADMIN"); 
    userQuery.setParameterList("uRoles", roles); 
    List<User> admins = userQuery.getResultList(); 

Cependant, la requête ne renvoie aucun résultat.

+0

'Set rôles = new HashSet ()' est ce que l'utilisation des rôles ici? Et d'où vient l'argument 'userRoles'? – msagala25

+0

userRoles était une faute de frappe. Pardon. 'Set roles' contient une liste de tous les rôles que je recherche dans ce cas précis, il est juste ROLE_ADMIN mais il pourrait être ROLE_ADMIN et ROLE_WRITER par exemple – AHAW

Répondre

0
session.createQuery(
    "from User as user join user.userRoles as userRole where userRole.role in :roles") 
    .setParameter("roles", Arrays.asList("ROLE_ADMIN")) 
    .getResultList(); 
+0

Je veux utiliser une liste parce que je pourrais faire quelque chose comme' Set roles = nouveau HashSet (); roles.add ("ROLE_ADMIN"); roles.add ("ROLE_WRITER"); roles.add ("ROLE_READER"); ' – AHAW

+0

@AHAW Mise à jour de la réponse. – TheKojuEffect