2016-07-06 53 views
0

在我當前的批處理項目中,爲了獲得通用可滾動結果,我需要編寫一個條件或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);