2017-05-30 1 views
0

J'essaie d'utiliser les Critères d'Hibernation pour une sélection en utilisant des tables liées dans une relation plusieurs-à-plusieurs. La table n-m comporte des colonnes supplémentaires, pas seulement les identifiants de chacune des tables.Critères d'Hibernation - Relations de plusieurs à plusieurs

CriteriaBuilder builder = em.getCriteriaBuilder(); 
CriteriaQuery<User> criteria = builder.createQuery(Fornecedor.class); 
Root<User> root = criteria.from(User.class); 
criteria.select(root); 
root.fetch("userRolesList"); 
List<User> users = em.createQuery(criteria).getResultList(); 

En classe User, j'ai la userRolesList (table n-m) qui a les rôles. J'ai donc User -> UserRoles -> Role. Chaque propriété est mappée comme FetchType.LAZY

  1. Lorsque je tente d'imprimer les rôles utilisateur, par exemple, mise en veille prolongée lance la org.hibernate.LazyInitializationException provoque les rôles où pas tiré par les cheveux.

  2. Lorsque je change de code pour celui qui suit.

Code:

CriteriaBuilder builder = em.getCriteriaBuilder(); 
CriteriaQuery<User> criteria = builder.createQuery(Fornecedor.class); 
Root<User> root = criteria.from(User.class); 
criteria.select(root);  
root.fetch("userRolesList"); 
root.fetch("userRolesList.role"); 
List<User> users = em.createQuery(criteria).getResultList(); 

je reçois:

java.lang.IllegalArgumentException: Impossible de trouver un attribut avec le nom donné [userRolesList.role] sur ce ManagedType [Utilisateur]

J'ai essayé beaucoup d'options pour la situation ressemble à des jointures, mais ne pouvait toujours pas le faire fonctionner.

Répondre

1

Il semble que vous essayez d'aller un peu trop loin avec le chargement.

Essayez de le faire à petits pas:

CriteriaBuilder builder = em.getCriteriaBuilder(); 
CriteriaQuery<User> criteria = builder.createQuery(Fornecedor.class); 

Root<User> root = criteria.from(User.class); 
criteria.select(root); 

Fetch<User, UserRoles> userRolesFetch = root.fetch("userRolesList", JoinType.INNER); 
Fetch<UserRoles, Role> roleFetch = userRolesFetch.fetch("role", JoinType.INNER); 

List<User> users = em.createQuery(criteria).getResultList(); 
+0

Parfait! J'ai raté le "fetch interne". J'essayais de faire les deux extractions depuis la racine. Parfait! Merci! – lfdajr