2016-04-22 15 views
0

ich folgende (für dieses Beispiel: MySQL) realisieren will Anweisung in JPA 2.1 mit Eclipse als Implementierung:JPA - Abfrage mit ‚Composite-Wert‘ in where-Klausel

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

Was ich erreichen will ist eine Implementierung der Suchmethode für endloses Scrollen ohne Verwendung eines Offsets in der Abfrage. Mit Fokus auf die Where-Klausel kann ich keinen korrekten Namen für dieses Konstrukt finden. An einigen Stellen wird es "zusammengesetzter Wert" genannt, aber ich kann keine Ergebnisse mit diesem Namen finden, aber es scheint mit dem SQL-92-Standard konform zu sein.

Diese Aussage wird um Filterparameter erweitert, also möchte ich natürlich mit der JPA-Kriterien-API bauen.

Ich habe die API schon seit einiger Zeit durchsucht, tut jemand jetzt, ob und wie das möglich ist?

Antwort

0

Nach der Realisierung, dass

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

ist nur ein kürzerer Weg

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; 

die Kriterien Abfrage zu schreiben war nicht so schwer, nachdem alle (hängten nur das Prädikat):

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); 
} 

Wenn es einen schöneren Weg gibt, wäre ich sehr froh darüber zu erfahren.

+0

Ihre längere Abfrage werden Sie Ergebnisse, wo mailing_zip_code größer als '56237' und id-Wert kleiner als 276. Ist die Bedeutung von '(mailing_zip_code, id)> (x, y)'? Ich finde das überraschend. – carbontax

+0

Woher bekommen Sie den 'weniger als 276' Teil? Ich sehe einen Tippfehler (276 statt 275), aber die Aussage sagt deutlich "id> 276". Ich fand diese Aussage in dieser Präsentation von Markus Winand: http://image.slidesharecdn.com/paginationdonethepostgresqlwayv2-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 beiseite, las ich die Abfrage als eine Vereinigung der Menge aller Konten zurückkehren, wo mailing_zip_code größer als ‚56237‘ (die id von Wert) und der Menge aller Konten enthält, wo mailing_zip_code = ‚56237 'und id> 276 – carbontax