2016-07-06 8 views
0

私の現在のバッチ処理プロジェクトでは、エンティティを1つずつ処理するために、一般的なスクロール可能な結果を​​取得するための基準またはHQLを記述する必要があります。処理が完了すると、エンティティIDはcheckpointIdというチェックポイントとして保存されます。ジョブを再起動する必要がある場合は、別のスクロール可能なクエリが作成され、checkpointIdで開始されます。このバッチジョブでは、@Idのすべての種類のエンティティが受け入れられます。Hibernateで一般的なスクロール可能な結果のための基準またはHQLを書くには?

SQLに変換すると、次の文に似ています(FETCH NEXT)。

SELECT * FROM my_table WHERE id > checkpoint_id LIMIT 1 

私はJavaでそれを実装する場合、それは次のようになります。

Class<?> entityType = MyClass.class; 
ScrollableResults scrollableResults = session 
     .createCriteria(entityType) 
     .setCacheable(false) 
     .setFetchSize(1) 
     // 
     // TODO: where id > checkpointId 
     // 
     .setMaxResults(maxResults) 
     .scroll(ScrollMode.FORWARD_ONLY); 

しかし、問題は、次のとおりです。

  • HibernateセッションでWHERE条件を実装する方法は?
  • 現在のエンティティの識別子の種類を知るには?

私は基準を使用しています。 HQLが簡単な場合は、HQLを受け入れることができます。休止状態のバージョンは5xです。

答えて

0
Class<?> entityType = MyClass.class; 
ClassMetadata md = sessionFactory.getClassMetadata(entityType); 
ScrollableResults scrollableResults = session 
     .createCriteria(entityType) 
     .setCacheable(false) 
     .setFetchSize(1) 
     .add(Restrictions.gt(md.getIdentifierPropertyName(), checkpointId)) 
     .setMaxResults(maxResults) 
     .scroll(ScrollMode.FORWARD_ONLY); 
関連する問題