2011-12-18 17 views
5

JPA sorgusunda alt sorguda LIMIT uygulanması mümkün mü?JPA sorgusunun alt sorgusunda LIMIT nasıl uygulanır?

ben olurdu JPQL LIMIT kullanamazsınız beri

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 

gibi bir şey olurdu JPQL doğrudan dönüştürme saf 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 

sorgu aşağıdakilere sahip Üzerinde setMaxResults(1) kullanın. Peki ya alt sorgu hakkında?

Güncelleme: şimdilik @NamedNativeQuery ile gitmeye karar verdi ancak DB özgü kod

. Eğer saf JPA çözümü önerileriniz varsa, bunu gerçekten takdir edeceğim.

cevap

2

JPQL ile bunu nasıl yapacağımı bilmiyorum ama bunu muhtemelen Kriteri API'sı ile halledebilirsin, en azından bunu Hibernate kriterler alt sorgularıyla yapabileceğimize eminim, bu yüzden JPA ile de mümkün olduğunu tahmin ediyorum. JPA kriteri api bana biraz kafa karıştırıcı görünüyorsa.

Kontrol bu: JPA 2.0, Criteria API, Subqueries, In Expressions

Neyse hatta alt sorgu için bir sınır gerekmez.

Orijinal sorgusu: RangeStart art limiti 1 tarafından RangeStart> = 1537022421 sipariş Size sadece belirli bir değerin üzerinde olan sizin ipinfo listesi asgari RangeStart istiyorum görünüyor nerede ipinfo gelen RangeStart seçmek . Bunun için min işlevi yapılmıştır.

Sadece böyle bir alt sorgu kullanabilirsiniz:

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

Böyle bir şey ile alt sorgu döndü ipinfo diğer ihtiyaç bu yapılabilir bile:

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

cehennemi evet! Min düşünmedim. Çok teşekkür ederim! – expert

+1

Bu hoş ve her şeyden önce, ama asıl soruya bir cevap vermeyi çok isterim. – Amalgovinus