2011-07-24 72 views
1

我有下面的代碼段,我想用回我的對象​​的集合:Hibernate的標準列表迭代

Session session = HibernateUtil.getSession(); 

List<MyObj> myObjList = (List<MyObj>) 
     session.createCriteria(MyObj.class) 
      .add(Restrictions.eq("searchField", searchField)).list(); 

Iterator<MyObj> myObjIt = myObjList.listIterator(); 
log.debug("list size: " + myObjList.size()); 

while(myObjIt.hasNext()){ 
    MyObj myObj = myObjIt.next(); 
    log.debug(myObj.getMyField()); 

} 

然而,我的日誌保留打印相同的記錄多次的大小列表。如果我稍微重構,我的代碼可以像這樣正確地工作:

SQLQuery query = session.createSQLQuery(
    "select my_field from my_table where search_field = :searchField" 
    ); 

query.setParameter("myField", myField); 
List result = query.list(); 
for(Iterator iter = result.iterator(); iter.hasNext();){ 
    Object[] row = (Object[]) iter.next(); 
    log.debug(row[0]); 
} 

我在第一段代碼段中做錯了什麼?我應該可以採用這種方式,因爲我使用Hibernate,所以我寧願ORM按預期工作,所以我寧願使用前者而不使用後者。任何人有任何想法?

Fwiw,我正在使用Hibernate 3.5.4 final,Hibernate-validator 4.2.0 Final,hibernate-search 3.4.0 Final和hibername-c3p0 3.6.5 final,全部來自maven回購站。

編輯根據意見澄清。

+1

不明白你期望'正確'的行爲。如果您查詢名稱='Joe'的每個對象;並返回100個對象。然後,如果你迭代他們並打印名字,你還希望看到什麼,但'喬'100次? – Affe

+0

對不起。我澄清。我正在尋找一個會出現多次值的字段,並且正在尋找其他字段的值。當我模糊了我正在做的一些事情時,這會迷失方向。 – dmcnelis

回答

1

從你在問題中描述的內容中,你的兩個代碼段應該返回相同的結果。假設在第一段代碼段Hibernate執行與第二段相同的查詢(您可以在日誌中檢查它,只需啓用'hibernate.show_sql'配置參數) - 問題在某處將結果集轉換爲MyObj列表。這很可能是由於hibernate中的一個錯誤而發生的,所以可能是由於不正確的實體類映射。如果您沒有發現任何映射問題,請在問題中添加更多詳細信息(實體類具有映射,數據庫表架構和數據示例),以便任何人都可以重現問題。

可能MyObj類沒有正確定義Id列映射。例如,如果映射爲Id的字段/屬性對結果列表中的所有對象具有相同的值,則hibernate將返回相同的對象(與您的情況相同)。 使用原語爲ID類型關於:冬眠允許使用基本類型,但它在文檔下面一行:

我們建議您對持久化類聲明命名一致的標識屬性和你使用一個可以爲空(即非原始類型)。

總結可能的Id映射問題: 1. Id映射列在db中不唯一。 2. Id屬性getter映射的對應setter未指定或不真正保存傳遞的參數值。 3.不可空類型的Id字段。

+0

我確實爲該對象設置了一個ID(使用註釋)。 – dmcnelis

+0

@dmcnelis該字段映射爲Id,它是唯一的嗎?我的意思是,以下查詢是否爲每行返回不同的'my_id':'select my_id,my_field from my_table where search_field =:searchField' – Andrey

+0

是的,它確實,映射到'my_id'的字段是該字段的主鍵。它在我的代碼中聲明爲@Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name =「my_id」) protected int myId; – dmcnelis