2016-10-20 75 views
0

簡單的Java批量使用JPA/Hibernate讀取數百萬行。我的問題是:如何通過ScrollMode.FORWARD_ONLY識別中的最後結果?Hibernate - 使用ScrollMode.FORWARD_ONLY獲取ScrollableResults的最後一個元素

使用isLast()方法它不是隻有前進滾動模式的選項,而使用ScrollMode.SCROLL_INSENSITIVE會降低批處理的性能。

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import org.hibernate.Query; 
import org.hibernate.ScrollMode; 
import org.hibernate.ScrollableResults; 
import org.hibernate.Session; 
import org.hibernate.StatelessSession; 

StatelessSession statelessSession = ((Session) em.getDelegate()).getSessionFactory().openStatelessSession(); 
Query query = statelessSession.createSQLQuery("MY_QUERY") 
         .setReadOnly(true) 
         .setFetchSize(Integer.valueOf(1000)); 
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY); 
while (results.next()) { 
... 
//I need to extract a timestamp from the last record here 
} 
+0

你有沒有使用查詢,僅僅獲得考慮反而是最後的結果。 –

+0

不,因爲我還需要其他行和一個額外的查詢,以便讓最後一個元素爲已經很重的批次添加太多開銷。 –

回答

1

有你,儘管這樣做的這個「基本」的方式(如果是的話,爲什麼它不工作?):

ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY); 

Timestamp ts = null; 
while (results.next()) { 
    ... 
    //I need to extact a timestamp from the last record here 
    ts = results.getTimestamp("timestamp_column"); 
} 

// you'll have here ts with the value of the latest row. 
// Be careful, it can be null in case of empty result set. 
+0

該死的,我沒有想過這個,我只是簡單地把與那個時間戳有關的邏輯移過循環,並且每次都更新ts值直到結束。非常感謝你。 –

相關問題