使用hibernate的JPA 2条件查询无法离开连接

时间:2012-07-05 22:03:43

标签: java hibernate java-ee jpa-2.0 criteria-api

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

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

任何想法或想法都将受到高度赞赏。

1 个答案:

答案 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很有用。