2011-12-18 78 views
5

是否有可能對JPA查詢中的子查詢施加LIMIT限制?如何對JPA查詢的子查詢強加LIMIT?

我在純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 

以下查詢直接將其轉換爲JPQL我不得不像

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使用LIMIT我不得不使用setMaxResults(1)就可以了。但是,子查詢呢?

更新:

我決定@NamedNativeQuery去,但現在它的具體的DB-代碼。如果你們可以建議純粹的JPA解決方案,我會非常感激。

回答

2

我不知道如何做到這一點與JPQL,但你可以處理它與Criteria API,至少我敢肯定,我們可以做到這一點與Hibernate條件子查詢,所以我想這也可以與JPA甚至如果JPA標準API顯得有點令我困惑。

檢查: JPA 2.0, Criteria API, Subqueries, In Expressions

反正你甚至不需要你的子查詢的限制。

原始查詢: 從ipinfo其中的RangeStart> = 1537022421爲了通過的RangeStart遞增限制1 看來你希望你的ipinfo名單,這僅僅是高於給定值的最小的RangeStart選擇的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

地獄啊!我沒有想到'min'。非常感謝你! – expert

+1

這很好,但我真的很想回答原來的問題.. – Amalgovinus