2013-05-07 54 views
0
返回

我正在編寫運行保齡球遊戲的webapp的代碼。球員得分被保存在一個數據庫中,因此前十名可以被檢索到以便在主頁上看到。問題是,我無法訪問從從數據庫中檢索分數的方法返回的arraylist中的值。從arraylist訪問元素從方法

這是一個JUnit測試方法:(CDR是頂級球員,應該認定爲true)

<!-- language: c# --> 
public class DatabaseTest { 
ScoreDB sdbTest = new ScoreDB(); 
@Test 
public void testTopPl(){ 
    assertTrue(sdbTest.listTopPlayers().get(0).getName() == "CDR"); 
    } 
} 

這是數據庫檢索代碼:

public List<Player> listTopPlayers(){ 
     Transaction trns = null; 
     Session session = HibernateUtil.getSessionFactory().openSession(); 
     List<Player> topPlayers = new ArrayList<Player>(); 

     try { 
      trns = session.beginTransaction(); 
      List<Player> players = session.createQuery("FROM Player").list(); 

      Collections.sort(players, new ScoreComparator());    

      for (int i=0; i<10; i++){ 
       topPlayers.add(players.get(i)); 
      } 
      // System.out.print(topPlayers.get(0).getName() + " test"); 

      trns.commit(); 
      trns = session.beginTransaction(); 
      }catch (RuntimeException e) { 
       if(trns != null){ 
        trns.rollback(); 
       } 
       e.printStackTrace(); 
       } finally{ 
       session.flush(); 
       session.close(); 
      } 
     return topPlayers; 
    } 
} 
+2

「無法訪問」是什麼意思?它會拋出一個錯誤嗎?它是否返回錯誤的項目? – christopher 2013-05-07 12:05:02

+0

它並沒有出現錯誤,但是當我運行JUnit測試用例時,即使我檢查了要返回的ArrayList,但在獲得預期值的方法中,我也得到了失敗的測試。 – jchoran 2013-05-07 12:07:54

回答

0

首先你應該的在數據庫中使用order by,在查詢中使用setMaxResults只返回前10位。否則,你可能會遇到內存問題。

第二次你打電話開始交易兩次。只做一次,此外,您處於不需要事務的只讀操作。

Finnaly發佈你的問題,你是否得到一些空指針或分離的實體異常?如果您正在獲取detatched實體在您正在閱讀的屬性中使用Hibernate.initialize。

當然,使用EQUALS來比較字符串。 這可能是你真正的問題。不要使用「==」運算符比較Java中的字符串。

希望這些提示將是有用的。

+0

感謝您的回覆。我沒有收到錯誤,只是運行一個應該通過的JUnit測試用例失敗。 – jchoran 2013-05-07 12:11:05

+0

對,現在我覺得自己像個白癡!使用「==」而不是「equals」。謝謝! – jchoran 2013-05-07 12:13:55