在我的应用程序中,我拥有具有权限的角色,我曾经这样做过:
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();
但希望更好地控制延迟初始化。所以我正在尝试这个,但它不起作用,因为连接正在执行,好像它是一个内部连接,没有带来一个角色及其权限,但每行和每个权限也有一个结果。
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;
}
任何想法或想法都将受到高度赞赏。
答案 0 :(得分:1)
我有点不清楚你想要达到什么目标,但无论如何可能会有所帮助。
这是默认的内部联接,如API中所述。
//join permissions by default "LEFT"
//***THIS LINE IS FAILING*** ????
queryRoot.join(Role_.permissions);
如果您需要类似于原始JPQL查询的内容,可以使用fetch完成。如果你想使用左(外)连接,可以使用join作为参数的JoinType方法来完成:
queryRoot.join(Role_.permissions, JoinType.LEFT);
当需要不同的结果时,CriteriaQuery.distinct很有用。