在我的应用程序中,我有具有权限的角色,我曾经这样做过:
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;
}
任何想法或想法将不胜感激。
最佳答案
我有点不清楚你想要达到什么目的,但也许下面的内容有帮助。
默认情况下这是内部连接,如 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很有用。
关于java - 使用 hibernate 的 JPA 2 标准查询无法左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353187/