【问题标题】:Map Object Array to a Bean将对象数组映射到 Bean
【发布时间】:2019-10-13 10:48:02
【问题描述】:

我正在通过 JPA 进行 SQL 查询并获取对象数组列表。我希望将这些对象数组映射到一个 bean 中。

例如,我的查询给出了以下输出。

List<Object[]> list = // myWorkingJpaQuery;
// list is of length 2. 
// Each Object array always holds a Long in index 0, 
// a TimeStamp in index 1 and a String in index 2. 

我不想读取这些值并执行转换,而是希望将其映射到一个类,如下所示:

class ExampleClass{
    //all these variables matches the aliases in myWorkingJpaQuery.
    Long id;
    TimeStamp ts;
    String name;
    // get set
}  

尝试使用上面的类,我更改了 JPA 方法的返回类型并将其分配到调用类中,如下所示,但它不起作用。

List<ExampleClass> list = // myWorkingJpaQuery with List<ExampleClass> as return type;

有没有办法做到这一点?如果我坚持使用对象数组但只是尽量不使用对象和铸件,它目前工作正常。作为参考,我使用的是 Spring。

【问题讨论】:

标签: java


【解决方案1】:

假设您使用的是本机查询(否则,ORM 工具会自动为您执行此操作):

你可能有这样的代码:

 EntityManager em = ...
 Query q = em.createNativeQuery("SELECT ...");
 List<Object[]> results = q.getResultList();

在这种情况下,您可以考虑向createNativeQuery 方法传递一个附加参数:

 Query q = em.createNativeQuery("SELECT...", ExampleClass.class);
 List<ExampleClass> results = q.getResultList();

对于更复杂/自定义的映射考虑使用Result Set Mappings feature

【讨论】:

  • 我正在使用 Spring + Jpa 并使用 @Query 注释。这不是原生查询。
【解决方案2】:

你的 ExampleClass 有构造函数吗? 如果是,您应该能够执行以下操作:

List<ExampleClass> myList = new ArrayList<ExampleClass>();
List<Object[]> list = // myWorkingJpaQuery;
for (int i = 0; i < list.size(); i++) {
        ExampleClass obj = new ExampleClass(list.get(i)[0],list.get(i)[1],list.get(i)[2]);
        myList.add(obj);
    }

你完成了

【讨论】:

  • 我明白你的意思,但不是我要找的。我希望在执行查询后直接映射结果。这为循环引入了新的逻辑。必须有一种映射方式。上面的链接看起来很有希望。
猜你喜欢
  • 2020-09-28
  • 2022-11-24
  • 1970-01-01
  • 2021-04-18
  • 2020-11-09
  • 2016-05-31
  • 2018-09-22
  • 2021-07-29
  • 1970-01-01
相关资源
最近更新 更多