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)))
正如你可以看到有上表員工提供不必要的加入。我如何擺脫這種連接?
對不起,由於我們的Weblogic Dependeny 10.3.5,我必然會使用eclipselink 2.3。我無法改變模型。我會嘗試加入方法。 – Christian
我申請了一個錯誤:https://bugs.eclipse.org/bugs/show_bug.cgi?id=395792 – Christian
最新版本[EclipseLink的2.5.1(https://www.eclipse.org/eclipselink/downloads/ )在使用Hibernate中不會發生的某種類型的子查詢時也會產生醜陋,多餘,冗餘,笨拙的連接。很難判斷它是否是故意的。 – Tiny