2013-05-07 56 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