java - 使用 hibernate 的 JPA 2 标准查询无法左连接

标签 java hibernate jakarta-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;
}

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

最佳答案

我有点不清楚你想要达到什么目的,但也许下面的内容有帮助。

默认情况下这是内部连接,如 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/

相关文章:

java - 如何使用 JNA 调用返回字符串的 Delphi 函数?

java - 当没有值时,将值设置为空

Java 多维 ArrayList Int

java - Hibernate Id 序列在具有两列序列的实体中导致 null

java - hibernate 如何访问私有(private)字段?

mysql - 使用wamp的mysql地址

JAVA Appium Android MultiTouch操作错误消息: “Unable to perform multi pointer gesture” ,“状态”:13

java - Hibernate 注释中的映射

java - Spring MVC 3.1 RedirectAttributes 不工作

Java - 文件共享文件锁定问题