我有一個JPA查詢和以下實體:EclipseLink重新排序謂詞?
- 產品
- 顏色
- 隊
- 人
- 隊
- 人員名單
- 顏色
- 人
產品可以有一個人或一個團隊。不是都。現在我想要一個查詢,查找特定人員的所有產品,作爲單個人員以及團隊成員(因此結果列表應包含兩種情況)。所以,我有我的查詢結構如下:
public List<Product> getProductsFor(Person person){
CriteriaBuilder cb = getEntitymanager().getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root<Product> root = query.from(Root.class);
Join<Product, Team> teamJoin = root.join(Product_.team, JoinType.LEFT);
Predicate asSinglePerson = cb.equal(root.get(Product_.person), person);
Predicate asTeamMember = cb.isMember(persons, teamJoin.get(Team_.members));
Predicate teamOrSingle = cb.or(asTeamMember, asSinglePerson);
query.where(teamOrSingle);
return getEntityManager().createQuery(query).getResultList();
}
然而,的EclipseLink從上面建立以下(Postgre)SQL代碼:
SELECT t1.*
FROM
Product t1 LEFT OUTER JOIN team t2 ON (t2.ID = t1.team_ID),
team_person t3,
person t4
WHERE
(t1.person_ID = 1 OR t4.ID = 1)
AND t3.team_ID = t2.ID
AND t4.id = t3.person_ID
一些括號裏省略,但查詢是一樣的。 此查詢僅返回人員是團隊成員的產品,但不返回該人員作爲單個人員負責的產品。
我要的是這樣的:
SELECT t1.*
FROM
Product t1 LEFT OUTER JOIN team t2 ON (t2.ID = t1.team_ID),
team_person t3,
person t4
WHERE
t1.person_ID = 1
OR (t3.person_ID = t4.ID AND t3.team_ID = t2.ID AND t4.ID = 1)
由於OR-運營商是最外面的一個在我的詢問,爲什麼不是在產生的SQL?
將查詢分爲2個部分(一個用於團隊部分,一個用於單個部分)不是一個選項,因爲我們在這個查詢中內置了分頁和過濾功能(不影響結果,所以我省略了它在列表中)。
感謝您的幫助。
構建完我需要的精確SQL後,這也是我所做的結論。我猜想我錯了方向。謝謝! – bmurauer