java - jpa子查询中不必要的连接

标签 java jpa jpa-2.0 eclipselink criteria-api

我有以下 jpa 标准查询:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Company> cq = cb.createQuery(Company.class);
    Root<Company> root = cq.from(Company.class);
    cq.select(root);

    Subquery<String> sq = cq.subquery(String.class);
    Root<Employee> subroot = sq.from(Employee.class);
    sq.select(subroot.get(Employee_.lastName));

    Predicate typePredicate = cb.equal(subroot.get(Employee_.lastName), "Doe");

    Predicate correlatePredicate = cb.equal(root.get(Company_.employees), subroot);
    sq.where(cb.and(typePredicate, correlatePredicate));
    cq.where(cb.exists(sq));


    TypedQuery<Company> typedQuery = em.createQuery(cq);
    List<Company> companies = typedQuery.getResultList();

Eclipselink 生成以下 SQL:

    SELECT t0.ID, ... FROM COMPANY t0 
    WHERE EXISTS (SELECT t1.LASTNAME FROM EMPLOYEES t2, EMPLOYEES t1 
                  WHERE (((t1.LASTNAME = ?) AND (t1.ID = t2.ID)) 
                  AND (t2.COMPANY_ID = t0.ID))) 

正如您所看到的,表 EMPLOYEES 上存在不必要的联接。我如何摆脱这个连接?

最佳答案

您似乎不需要子查询来进行查询,只需一个联接就足够了,

http://en.wikibooks.org/wiki/Java_Persistence/Criteria#Join

否则,您使用的是什么版本?您可以尝试一下 EclipseLink 2.4吗?

如果仍然有重复项,请记录错误并为其投票。

您也许可以使用逆ManyToOne,而不是OneToMany(即 root == subroot.get("company") )。

也尝试一下2.4中的JPQL,连接优化了吗?

关于java - jpa子查询中不必要的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13704016/

相关文章:

java - NullPointerException @一对一映射

java - 如何用JPA注解Map<Entity,INTEGER>?

java - 为什么 Java 元编程支持不是更好?

Java:通过正则表达式字符串解析用元素丰富 xml

java - ViewModelProviders#of(Fragment) 类型错误

java - 从一个 Bean 创建两个 JPA 表?

hibernate - Spring Data 悲观锁超时与 Postgres

java - JPA 实体监听器和@embeddable

java - Jackson 中的 JSON 属性文件不区分大小写

java - 应用程序在 weblogic 中不工作