2014-06-24 51 views
0

我有一個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個部分(一個用於團隊部分,一個用於單個部分)不是一個選項,因爲我們在這個查詢中內置了分頁和過濾功能(不影響結果,所以我省略了它在列表中)。

感謝您的幫助。

回答

1

'和'子句與您的'或'語句無任何關係,並且因爲您用於構建查詢的連接語義而存在。關係的'get'是使用內部聯接定義的,並且需要過濾結果,並且這些聯接可以在From子句中完成或附加到where子句。

您需要在team.members關係中明確使用Left外部聯接以獲取您正在查找的查詢結果,這與您完成product.team關係的過程類似。

+0

構建完我需要的精確SQL後,這也是我所做的結論。我猜想我錯了方向。謝謝! – bmurauer