2012-12-19 29 views
1

我有一個通過休眠連接到數據庫的表單。通過此表格,用戶可以進入並填寫姓名,地址和電子郵件信息等字段。填完信息後,他們將提交表格。提交後,所有信息將顯示在同一頁面的數據表上。休眠迭代器檢索相同的數據

我正在使用會話與數據庫交互。但是,從數據庫填充的數據似乎並不正確。

public void somefunction() { 

    //The sessionfactory is being configured in another class 
    Session s = sessionFactory.openSession(); 
    Transaction tx= null; 

    try { 
     tx= s.beginTransaction(); 

     List userInformation = s.createQuery("FROM database1 WHERE PKEY ='"+somevalue+"'").list(); 

     for(Iterator iterator = userInformation.iterator; iterator.hasNext();){ 

      //database1 is an entity bean 
      database1 x = (database1) iterator.next(); 

      System.out.print(x.getName()); 
     } 
     tx.commit(); 
    } 
    catch(Exception) {......} 
    finally {.....} 
} 

提交的第一個「用戶」與他們的信息的用戶之後,一切都在數據表中精細顯示出來。但是,當他們輸入第二個「用戶」時,即使數據不同,顯示在數據表上的行也是與第一個用戶相同的信息。我認爲代碼看起來是正確的,所以我不確定這有什麼問題。

+0

迭代前檢查列表大小? –

+0

上面的代碼看起來沒問題。你能分享你的原始代碼片段嗎?我懷疑它是一些對象引用問題。 –

+0

@ user1817081我在查詢中沒有看到任何主鍵。更改對象的名稱(掩碼)以保持機密性,但發佈確切的片段(不要共享完整的代碼)。我懷疑你可能在某處使用同一個對象引用。 –

回答

0

你應該使用主鍵來獲得正確的值。 List userInformation = s.createQuery(「FROM database1 where yourId ='PK'」)。list();

在您的查詢中,它總是返回第一行。

+0

謝謝,很抱歉忘了添加那個部分。我確實已經將它篩選到了其中一個主鍵中的特定值。 – user1817081

0

找到解決方案。

而不是使用session.createQuery("QUERY")的,我用

Criteria cr = session.createCriteria(SomeClass.class) 

cr.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

cr.add(//add some filters here); 

ScrollableResults sr = cr,scroll(ScrollMode.FORWARD_ONLY); 

while(sr.next){ 
someObject so = (someObject) sr.get(0); 
//Do action here 
} 

這解決了我的returing一個結果的問題。

+0

那麼它是由連接引起的。我相信你可以簡單地在HQL中使用'distinct'。即使不是,創建一個HashSet並將所有結果放在集合中也應該這樣做(這或多或少是DISTINCT_ROOT_ENTITY在做什麼的) –