2016-11-10 47 views
0

我有一個POJO類的人有兩個字段。讓我們假設只有其中一人持有價值,另一種是總是空Criteria Api:在多選中使用另一個參數,如果第一個參數爲空

public class Person { 
    private String music; 
    private String sports; 
    ... 
} 

我想以填充的一種或另一種爲通過標準阿比的DTO的列表。 這裏是我的(不完全)DAO代碼的一個片段:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<PersonDTO> query = cb.createQuery(PersonDTO.class); 
Root<Person> root= query.from(Person.class); 

Path<String> musicPath = root.get(Person_.music); 
Path<String> sportsPath= root.get(Person_.sports); 

query.multiselect(/** TODO */); 

List<PersonDTO> results = em.createQuery(query).getResultList(); 

有沒有爲使用音樂奧德體育爲多選的方式,這取決於他們的不爲空當前記錄。 或者我必須定義一個子查詢來實現這種行爲?

回答

0

您正在查找COALESCE表達式(請參見「查詢語言」,在說明書中的「表達式」一節)。

創建一個表達式,如果其所有參數的計算結果都爲空,則返回null,否則返回第一個非空參數的值。

對應的標準API是CriteriaBuilder.coalesce()方法集合。選擇一個字符串是非常簡單的東西:

query.select(cb.coalesce(musicPath, sportsPath)); 

如果你想理所當然的PersonDTO,你將不得不利用CriteriaBuilder.construct()方法和適當的構造的:

query.select(cb.construct(PersonDTO.class, cb.coalesce(musicPath, sportsPath), ...)); 
+0

謝謝非常,coalesce做到了! 'construct'方法不是必需的,我只是做了一個: query.multiselect(cb.coalesce(musicPath,sportsPath),...) – wusi

相關問題