2011-12-18 5 views
5

JPAクエリでサブクエリにLIMITを課すことはできますか?JPAクエリのサブクエリにLIMITを課す方法は?

私は私が私が持っていると思いますJPQLでLIMITを使用することはできませんので、私は

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 

のようなものを持っていると思いますJPQLに直接変換する純粋なSQL

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 

でクエリを次のようしていますそれにsetMaxResults(1)を使用してください。しかし、サブクエリはどうですか?

更新:

私は今の@NamedNativeQueryで行くことにしましたが、それはDB固有のコードです。あなたが純粋なJPAソリューションを提案できるなら、私は本当にそれを感謝します。

答えて

2

私はJPQLでこれを行う方法はわかりませんが、Criteria APIを使って処理することは可能でしょうか?少なくとも、JPAでも可能ですJPA基準apiが私に少し混乱しているように見えます。とにかく、あなたもあなたのサブクエリの制限を必要としない JPA 2.0, Criteria API, Subqueries, In Expressions

はこれを確認してください。

あなたの元のクエリ: のRangeStartのRangeStartのASC制限1 によって> = 1537022421順序はあなただけで与えられた値を超えている、あなたのipinfoリストの最小のRangeStartをしたいと思われる場所ipinfoからのRangeStartを選択します。そのためにmin関数が作られました。

あなたは、単にこのようにサブクエリを使用することができます。

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

あなたが他のipinfoがあなたのサブクエリで返され、それはそのような何かを行うことができる必要がある場合であっても:

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

地獄ええ!私は「分」は考えなかった。どうもありがとうございました! – expert

+1

それは素晴らしいことですが、私は本当に元の質問への答えがほしいと思います。 – Amalgovinus

関連する問題