2012-06-15 45 views
4

我只需要從表格中獲取少量列值。所以我使用Projections來實現這一點。代碼起作用,但我認爲它不是有效的。休眠預測列表

我的問題是當我使用ProjectionsList &然後將criteria.list設置爲ArrayList - Bulletin對象爲null。我不確定如何更好地解釋這一點。所以我會把代碼,然後請參閱下文:

List<Bulletin> list = new ArrayList<Bulletin>(); 
BulletinList bulletinList = null; 

Criteria criteria = null; 

criteria = this.getSession().createCriteria(Bulletin.class) 
      .setProjection(Projections.projectionList() 
      .add(Projections.property(bulletinIdAttr)) 
      .add(Projections.property(docNameAttr)) 
      .add(Projections.property(docTypeCodeAttr)) 
      );   
    criteria.addOrder(Order.desc(createdTimeAttr)); 

    List<Object> rows = criteria.list(); 
    for (Object r : rows) { 
     Object[] row = (Object[]) r; 
     Bulletin bull = new Bulletin(); 
     bull.setBulletinId((Long) row[0]); 
     bull.setDocumentName((String) row[1]); 
     bull.setDocumentTypeCode((String) row[2]); 
     list.add(bull); 
     } 

    bulletinList = new BulletinList(); 
    bulletinList.setBulletins(list); 

    return bulletinList; 

我只需要criteria.list設置爲BulletinList(類保存公報對象的列表)。但是當我使用投影時,Bulletin對象爲null。

我也讀到另一個線程使用

setResultTransformer(Transformers.aliasToBean 

但不工作或者。那麼有人可以幫助解決如何使代碼更好。

由於

哈里什

回答

5
  1. Projections.property()需要一個字符串作爲參數。在你提供的代碼中,String的值應該是Bulletin類的成員的名稱。例如,假設bulletinIdAttr是一個具有這種值的字符串,否則您會收到運行時錯誤。
  2. 當您在Criteria實例上調用setProjection時,您隱式地將ResultTransformer設置爲PROJECTIONS,這就是您想要的。無需自己撥打setResultTransformer。我將簡化日常有點像這樣

    List<Object[]> rows = criteria.list(); 
    for (Object[] row : rows) { 
        Bulletin bull = new Bulletin(); 
        bull.setBulletinId((Long) row[0]); 
        bull.setDocumentName((String) row[1]); 
        bull.setDocumentTypeCode((String) row[2]); 
        list.add(bull); 
    } 
    

但是這不應該讓你的結果任何區別。你有沒有檢查rows是空的?

+0

非常感謝您的回覆。正如我所說我上面的代碼按預期工作,但只是想知道它是否有效。 Projections.property()以String作爲參數。當我嘗試使用您的代碼塊時,出現此錯誤: – Harry

+0

類型不匹配:無法在(Object [] row:rows)行上從元素類型Object轉換爲Object []。我在這裏錯過了什麼?請讓知道。 – Harry

+0

對不起哈里什,我原來的答案格式不正確,導致行的聲明錯誤。它應該像現在一樣工作。 – carbontax

6

您可以使用

criteria = this.getSession().createCriteria(Bulletin.class) 
      .setProjection(Projections.projectionList() 
      .add(Projections.property(bulletinIdAttr),"bulletinIdAttr") 
      .add(Projections.property(docNameAttr),"docNameAttr") 
      .add(Projections.property(docTypeCodeAttr),"docTypeCodeAttr") 
      );   
criteria.addOrder(Order.desc(createdTimeAttr)); 
criteria.setResultTransformer(new AliasToBeanResultTransformer(Bulletin.class)); 
List<Bulletin> bulletinList = criteria.list(); 

這裏criteria.setResultTransformer(新AliasToBeanResultTransformer(Bulletin.class))將改變你的結果所需的POJO類,但要確保你的POJO類(Bulletin.class你的情況)應該有適當的setter來設置屬性的值。

現在,criteria.list()將返回Bulletin POJO類的列表,而不是Object。

+0

不再在該項目上。但是非常感謝你的努力,儘管這是一條古老的線索。 – Harry

+0

這個問題被卡住了我的方式很多天,我不能這樣做讓使用Projections.projectionList()所有房產詳情,但現在我執行我的項目中使用這種方式,真的感謝先生@Shiva阿格拉瓦爾 –

3

如果您想要從相同的標準進行第二次搜索,則必須更改或刪除投影。例如,如果你搜索數第一:

criteria.setProjection(Projections.rowCount()); 
Integer count = criteria.list().get(0); 

,然後想獲取所有對象:

criteria.setProjection(null); 
List<Object> returnedObjects = criteria.list();