2014-09-11 39 views
1

我想批量迭代實體列表並想要更新同一實體中的特定字段。我想使用的邏輯如下:休眠:迭代一批對象並更新它

private void process() 
{ 
    int index = 0; 
    boolean hasMore = true 

    while (hasMore) 
    { 
      List<Model> models = DAO.getModels(index, batchSize); // batchSize is configurable 
      if (models != null && models.size() == 0) 
      { 
        System.out.println("found zero "); 
        hasMore = false; 
        break; 
      } 

      processModels(models); 
      index = index + batchSize; 
    } 
} 

的獲取模型方法有一個HQL查詢類似如下:

String hqlQuery = "from Model ac where ac.syncflag ='N'" 

的processModels()方法處理這些模型對象,並根據一些邏輯將syncflag值設置爲'Y'。

中processModel()方法是這樣的:

private void processModel() 
{ 
if (models != null && models.size() > 0) 
     { 
      for (Model model : models) 
      { 
       this.updateFlagForModel(model); 

      } 
      } 
     } 

} 

private void updateFlagForModel(Model model) 
{ 
    // some processing........ 
    model.setFlag(true); 
    DAO.saveOrUpdate(model); 
} 

然而,正如我在迭代和更新同一對象的批處理邏輯是越來越不安,我無法處理正確的記錄數。

有人可以幫忙嗎?我是否需要在查詢部分添加一些額外的邏輯來處理這個問題?

問候

+1

'無法處理正確數量的記錄' - 我們該如何知道您的意思?請提供詳細和準確的問題描述。 – kostja 2014-09-11 13:01:30

+0

順便說一句你有沒有使用批量更新的原因? – kostja 2014-09-11 13:02:07

+0

迭代邏輯中斷,無法正確處理。假設我總共有9條記錄要處理。當我不執行實際更新並通過放入一些記錄器語句來驗證邏輯時,我可以看到所有9個記錄可供處理。但是,與實際更新操作相同的邏輯正在中斷,所有記錄都沒有得到處理。即使System.out語句(System.out.println(「找到零」);)沒有得到打印。 – Anand03 2014-09-11 13:09:22

回答

0

假設有從最小(ID)的時間間隔:1至最大(ID):10000與同步標誌= 'N'。讓我們選擇50作爲每個選擇大小。所以第一頁就會像下面

select ac from Model ac where ac.syncflag ='N' and id>=1 and id < 51(你繼續處理那些記錄) 下一次做查詢,如下

select ac from Model ac where ac.syncflag ='N' and id>=51 and id < 101 

,然後它會去,直到

select ac from Model ac where ac.syncflag ='N' and id>=9951 and id < 10001 

如果有在最後的更多記錄中,您可以再次創建新的批次迭代集,直到它結束。