2016-10-20 4 views
0

JPA/Hibernateを使用して数百万行のシンプルなJavaバッチを読み込みます。私の質問は、の最後の結果をどのようにして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値を更新し続ける。どうもありがとうございました。 –

関連する問題