2017-05-30 3 views
0

多対多関係に関連するテーブルを使用して選択するためにHibernate Criteriaを使用しようとしています。 n-mテーブルには、各テーブルのIDだけでなく、いくつかの追加の列があります。Hibernate Criteria - 多対多関係

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(); 

ユーザークラスでは、ユーザーロールリスト(n-mテーブル)にロールがあります。だから私はUser - > UserRoles - > Roleを持っています。私は、ユーザーの役割を印刷しようとすると、すべてのプロパティがFetchType.LAZY

  1. としてマッピングされ、例えば、Hibernateはorg.hibernate.LazyInitializationExceptionが取り出さない役割を引き起こすスローします。

  2. 次のコードを変更するとします。

コード:

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(); 

その後、私が取得:

java.lang.IllegalArgumentExceptionが:このManagedTypeに 与えられた名前[userRolesList.role]で属性を見つけることができませんが[ユーザー]

私は多くのオプションを試しました結合のような状況は、まだそれを動作させることができませんでした。

答えて

1

フェッチするにはあまりにも遠くに行っているようです。

は、赤ちゃんのステップでそれをやってみてください。

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

パーフェクト!私は "インナーフェッチ"が欠けていました。私はルートから両方のフェッチをしようとしていました。完璧!ありがとう! – lfdajr