2012-12-04 35 views
2

我有以下JPA的條件查詢:不必要加入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))) 

正如你可以看到有上表員工提供不必要的加入。我如何擺脫這種連接?

回答

2

你似乎並不需要查詢的子查詢,只需加入應該足夠,

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

否則,您使用的是什麼版本?你可以試試EclipseLink 2.4嗎?

如果它仍然有重複,請記錄錯誤,併爲它投票。

您可能能夠使用逆多對一,而不是一對多(即根== subroot.get(「公司」))。

也試試2.4中的JPQL,是否優化了連接?

+0

對不起,由於我們的Weblogic Dependeny 10.3.5,我必然會使用eclipselink 2.3。我無法改變模型。我會嘗試加入方法。 – Christian

+0

我申請了一個錯誤:https://bugs.eclipse.org/bugs/show_bug.cgi?id=395792 – Christian

+0

最新版本[EclipseLink的2.5.1(https://www.eclipse.org/eclipselink/downloads/ )在使用Hibernate中不會發生的某種類型的子查詢時也會產生醜陋,多餘,冗餘,笨拙的連接。很難判斷它是否是故意的。 – Tiny