2016-10-13 97 views
0

我想選擇一個實體A與長值b和一堆其他值c一堆。我想獲得最大b值的A,或者如果不存在此類值,則返回A,其中b爲空。MAX(長)和null之間的JPQL比較

在我看來,這MAX(x)將一個long類型根據this doc,所以我希望做這個返回null:

SELECT entity FROM A entity 
WHERE entity.b = (SELECT MAX(a.b) FROM A a) 
AND entity.c = :c 

這種運作良好,當b具有已定義的長期價值。當b爲空時,我得不到結果。看起來=運算符不能比較NULL值。

我試圖在OR條款使用IS NULL但我只想與空值的實體,如果MAX結果爲空,下面的查詢返回兩個最大長值和空值:

SELECT entity FROM A entity 
WHERE (
      (entity.b = (SELECT MAX(a.b) FROM A a)) 
      (OR entity.b IS NULL) 
    ) 
AND entity.c = :c 

我如何選擇具有最大值b的實體或者沒有設置b,獲取b爲空的實體?

回答

0

NULLS FIRST|LAST可用於對結果進行排序,然後將結果限制爲1.然後不需要使用MAX(x)

由於NULL永遠是第一位和NULLS LAST沒有在我的環境我一直在使用這樣的查詢圍繞它的工作的支持:

SELECT entity FROM A entity 
WHERE entity.b = (SELECT MAX(a.b) FROM A a) 
AND entity.c = :c 
ORDER BY entity.b ASC 

而且一些代碼:

try { 
    ... 
    List<A> as = q.getResultList(); 
    result = as.get(as.size() - 1); 
catch (NoResultException e) { 
    // doo something 
} 

還是很感興趣儘管使用JSQL比較的答案!