2011-12-18 23 views
5

È possibile imporre LIMIT sulla sub-query nella query JPA?Come imporre LIMIT sulla sub-query della query JPA?

ho seguente query SQL in puro

select * from ipinfo 
where RangeEnd < (select RangeStart from ipinfo where RangeStart >= 1537022421 order by RangeStart asc limit 1) and (1537022421 <= RangeEnd) 
ORDER BY RangeEnd desc 
limit 1 

Conversione direttamente al JPQL avrei qualcosa come

select obj from IpInfo obj 
where obj.rangeEnd < (select obj2.rangeStart from IpInfo obj2 where obj2.rangeStart >= ?1 order by obj2.rangeStart asc limit 1) and (?1 <= obj.rangeEnd) 
ORDER BY obj.rangeEnd desc 
limit 1 

Dal momento che non posso usare LIMIT in JPQL avrei dovuto utilizzare setMaxResults(1) su di esso. Ma per quanto riguarda la sotto-query?

Aggiornamento:

ho deciso di andare con @NamedNativeQuery per ora, ma è il codice DB-specifica. Se voi ragazzi potete suggerirvi una soluzione JPA pura, lo apprezzerò molto.

risposta

2

Non so come farlo con JPQL ma probabilmente lo si può gestire con l'API Criteria, almeno sono abbastanza sicuro che possiamo farlo con le subquery dei criteri di Hibernate quindi immagino sia possibile anche con JPA se l'API di criteri JPA sembra un po 'confusa per me.

Controllare questo: JPA 2.0, Criteria API, Subqueries, In Expressions

In ogni caso non hanno nemmeno bisogno di un limite sul subquery.

vostra query originale: selezionare RangeStart da IPInfo dove RangeStart> = 1.537.022,421 mila ordine da RangeStart limite asc 1 Sembra si desidera che il RangeStart minima della vostra lista IPInfo, che è appena al di sopra di un certo valore. La funzione min è stata creata per questo.

Si potrebbe semplicemente utilizzare un subquery come questo:

select min(RangeStart) from ipinfo where RangeStart >= 1537022421 

Anche se avete bisogno IPInfo tornato sul subquery si potrebbe fare con qualcosa di simile:

select RangeEnd, anything,blabla from ipinfo where RangeStart = (
    select min(RangeStart) from ipinfo where RangeStart >= 1537022421 
) 
+0

Hell yeah! Non ho pensato a 'min'. Grazie mille! – expert

+1

Questo è bello e tutto, ma mi piacerebbe davvero una risposta alla domanda originale .. – Amalgovinus