2

在我的应用程序中,我有具有权限的角色,我曾经这样做:

   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;
}

任何想法或想法将不胜感激。

4

1 回答 1

1

我有点不清楚你想要达到什么目标,但无论如何可能会有所帮助。

默认情况下,这是内部连接,如API中所述。

//join permissions by default "LEFT"
//***THIS LINE IS FAILING*** ????
queryRoot.join(Role_.permissions);

如果您需要类似于原始 JPQL 查询的内容,可以使用fetch来完成。如果您想改用左(外)连接,可以使用以JoinType作为参数的连接方法来完成:

queryRoot.join(Role_.permissions, JoinType.LEFT);

当需要不同的结果时,CriteriaQuery.distinct很有用。

于 2012-07-11T08:35:26.073 回答