【问题标题】:How to get multiple columns from table using JPA?如何使用 JPA 从表中获取多个列?
【发布时间】:2014-05-04 10:24:44
【问题描述】:

例如,我有一个 Student 表格,其中包含 idnameage 等列 我正在使用 NativeQuery 恢复特定的列值,如下所示。

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

通过使用上面的查询,我们将获得 Student 表中的年龄列表 现在我想从表中获取 agename

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

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

注意 我的项目中没有任何实体类或 POJO 类我正在使用本机查询从数据库中获取表。

【问题讨论】:

  • 它抛出了什么异常。它应该可以工作并返回一个对象列表[]
  • @andy 很抱歉它正在执行,但我怎样才能在另一个列表中获取年龄和在另一个列表中的名称。谢谢
  • 使用强制转换,例如 for(Ojbect o:list){Object[] values = (Object[])o;int age = (int)values[0];String name = (String)values [1];}
  • @andy 谢谢它工作正常

标签: java hibernate jpa eclipselink nativequery


【解决方案1】:

您可以通过两种方式处理它。

  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();
    

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

【讨论】:

  • 我用第二种方式。我不知道第一种方法,现在可以了。谢谢
  • @Prabha 我遇到了同样的问题,我通过添加类似以下内容来修复: int age = (int) obj[0];字符串名称 = (String) obj[1];
  • 我建议使用第一个,因为当您使用大型应用程序时,如果使用第二个,数据库操作成本会很高。如果它使用很多地方,您还可以使用一些 dummyDTO 来设置值。
【解决方案2】:

我根据@dispake 的回答,他提出了两种解决此问题的方法,但他忘记了您将铸造用于第一种方法。在我看来,它是优化的(你只需要做一个查询而不是两个)这样做:

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

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

希望对你有帮助

【讨论】:

    【解决方案3】:

    我相信这个问题已经回答了here

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

    【讨论】:

    • 谢谢,我这里没有 POJO 类
    • 我想最简单的方法是创建它们。但是,如果您不想这样做 - 您可能会考虑使用标准 java.sql.Connection 实例?这样,您将自行管理查询和结果。 100% 控制。
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2016-08-27
    • 2020-10-16
    • 2021-02-14
    • 2019-08-06
    相关资源
    最近更新 更多