如何使用JPA从表中获取多个列?

时间:2014-03-26 07:08:13

标签: java hibernate jpa eclipselink nativequery

例如,我有一个表格学生它包含 id 名称年龄等列STRONG> 我正在使用 NativeQuery 恢复特定列值,如下所示。

Query query = entityManager.createNativeQuery("SELECT age FROM Student");
List list=query.getResultList(); 

使用上述查询我们将在学生表中获取年龄列表 现在我希望从表中获得年龄名称

Query query = entityManager.createNativeQuery("SELECT age,name FROM Student");
List list=query.getResultList();

如果我这样做,我的代码执行得很好,但是如何在一个列表中获取名称并在另一个列表中使用年龄。那么我该怎么做呢。非常感谢你

注意 我的项目中没有任何Entity类或POJO类我使用Native Query从数据库获取表。

3 个答案:

答案 0 :(得分:6)

你可以通过两种方式接近它。

  1. 将结果集中的值解析为单独的列表。由于您没有为其定义实体,查询将返回

    List<Object[]> list = query.getResultList();
    

    对于返回的每一行,您可以按其出现的索引访问年龄和名称。即在上面的示例中首先选择年龄,因此您将是索引0而名称是索引1.

    for (Object[] obj : list) {
         age = obj[0];
         name = obj[1];
         // ..put them into whatever collection you desire
    }
    
  2. 使用两个查询。一个选择AGE,另一个选择NAME。每个人都会将相应的值返回给它自己的列表。

    Query query = entityManager.createNativeQuery("SELECT age FROM Student");
    List ages=query.getResultList(); 
    
    query = entityManager.createNativeQuery("SELECT name FROM Student");
    List names=query.getResultList();
    

    这种方法的唯一警告是两个列表之间没有真正的关系。换句话说,年龄[3]可能在逻辑上不匹配名称[3]。但是......实际上,原始问题没有关于如何创建两个列表的任何定义。

答案 1 :(得分:1)

我相信这个问题已得到解答here

但是我强烈建议使用列名和年龄创建名为Student的标准实体。这种方法将更容易实现并在将来维护它。

答案 2 :(得分:1)

我根据@dispake的答案,他提出了两种解决此问题的方法,但他忘了把方法放在第一种方法上。我认为这是一种优化的方法(您只需要执行一个查询而不是两个查询)就可以做到这一点:

List<Object[]> list = query.getResultList();

for (Object[] obj : list) {
     int age = (int) obj[0];
     String name = (String) obj[1];
}

希望这对您有帮助