2016-04-22 119 views
0

我想實現如下(此示例:MySQL的)「複合價值」的查詢用的EclipseLink的JPA 2.1語句的執行:JPA - 在where子句

select * 
from account 
where (mailing_zip_code, id) > (56237, 275) 
order by mailing_zip_code asc, id asc 
limit 10; 

我想達到什麼是在查詢中不使用偏移量的無限滾動查找方法的實現。關注where子句,我無法找到這個構造的正確名稱。在某些地方,它被稱爲「複合值」,但我無法通過這個名稱找到結果,但它似乎符合SQL-92標準。

該聲明將通過過濾器參數進行擴展,所以很自然我想用JPA標準API來構建它。

我搜索了一段時間的API,現在有沒有人,如果這是可能的?

回答

0

意識到

select * 
from account 
where (mailing_zip_code, id) > (56237, 275) 
order by mailing_zip_code asc, id asc 
limit 10; 

只是寫短的方式後

select * 
from account 
where mailing_zip_code > '56237' 
or (mailing_zip_code = '56237' AND id > 276) 
order by mailing_zip_code asc, id asc 
limit 10; 

標準查詢並不難畢竟(附加只是謂語):

if (null != startId) { 
    Predicate dateGreater = cb.greaterThan(entity.get(sortBy), startValue); 

    Predicate dateEqual = cb.equal(entity.get(sortBy), startValue); 
    Predicate idGreater = cb.greaterThan(entity.get("id"), startId); 
    Predicate dateEqualAndIdGreater = cb.and(dateEqual, idGreater); 

    cb.or(dateGreater, dateEqualAndIdGreater); 
} 

如果有更好的方法,我會很樂意瞭解它。

+0

如果mailing_zip_code大於'56237'且id值小於276,那麼您的較長查詢會給出結果。'(mailing_zip_code,id)>(x,y)'的含義是什麼?我覺得很驚訝。 – carbontax

+0

你從哪裏得到'不到276'的部分?我看到一個錯字(276而不是275),但聲明清楚地表明「id> 276」。我在Markus Winand的演示中發現了這樣一句話:http://image.slidesharecdn.com/paginationdonethepostgresqlrecv2-130530141009-phpapp02/95/pagination-done-the-right-way-23-638.jpg?cb=1403756206(http ://de.slideshare.net/MarkusWinand/p2d2-pagination-done-the-postgresql-way REF = HTTP://use-the-index-luke.com/blog/2013-07/pagination-done-the -postgresql-way) – javahippie

+0

Typo放在一邊,我讀取查詢返回所有帳戶集合的聯合,其中mailing_zip_code大於'56237'(其中包括任何值的id)和所有帳戶的集合,其中mailing_zip_code ='56237 '和id> 276 – carbontax