私のアプリケーションには、アクセス許可を持つ役割があります。以前は次のようにしていました。
Query query =
em.createQuery(
"SELECT distinct r FROM Role r left join fetch r.permissions "
+ "where r.domain = ? " + "order by r.createdOn ").setParameter(
1, domain);
return query.getResultList();
しかし、遅延初期化をより細かく制御したいと考えていました。だから私はこれを試していますが、結合が内部結合であるかのように実行され、1 つのロールとその権限をもたらすのではなく、行ごとおよび権限ごとに 1 つの結果ももたらすため、機能しません。
public List<Role> findAll()
{
CriteriaBuilder criteriaBuilder;
CriteriaQuery<Role> criteriaQuery;
Root<Role> queryRoot;
Order createdOnDesc;
TypedQuery<Role> typedQuery;
List<Role> roleResultList;
//initialize query system
criteriaBuilder = em.getCriteriaBuilder();
//select * from Role
criteriaQuery = criteriaBuilder.createQuery(Role.class);
queryRoot = criteriaQuery.from(Role.class);
//join permissions by default "LEFT"
//***THIS LINE IS FAILING*** ????
queryRoot.join(Role_.permissions);
//get query
typedQuery = em.createQuery(criteriaQuery);
//the steps below must be done to avoid lazy initialization exceptions
//in case we want to access the list at a later time
roleResultList = typedQuery.getResultList();
for (Role role : roleResultList)
{
role.getPermissionsList();
}
return roleResultList;
}
どんな考えやアイデアも高く評価されます。