【发布时间】:2017-07-13 17:21:38
【问题描述】:
我正在尝试使用 createNativeQuery 从我的数据库中获取结果集并将其映射到实体对象列表。
当我这样做时
List<MyObject> results = this.em.createNativeQuery(query, MyClass.class).getResultList();
我最终得到了一个大小正确的实体对象数组,并正确映射到列,但它们都是同一个对象。返回的第一个结果对于我列表中的每个条目都是重复的。
在上图中,您可以看到我取回了数据,如果我检查 ovbject,它们会正确映射到我的列。但它们都是同一个对象。
如果我这样做了
List<Object[]> objects = this.em.createNativeQuery(query, Object.class).getResultList();
我得到了应有的不同对象的列表。但它们没有映射到我的 Entity 类。
在上图中,您可以看到,当我使用 Object 而不是我的 Entity 类类型时,我会为返回的每一行得到一个不同对象的结果集。我不知道为什么当我使用我的实体类时,它只是一遍又一遍地重复同一行。
有谁知道是什么导致我每次都得到同一个对象的列表?
我的查询是从存储过程中的流水线函数中选择
String query = "select * from table(myschema.mypackage.myfunction(input_var))";
更新
我在我的过程中调用的流水线函数返回大约 200 行。出于测试目的,我只映射了前几列。
我的实体类有 200 列中的前 13 列的列映射。
我调用该函数的查询正在执行select *,因此,它返回所有 200 列并映射前 13 列。我认为这是一个可能的问题,但我只是尝试使用我创建的新测试类并执行select * 从常规表转换为仅映射了 2 个列的实体。没有问题。它返回一个不同对象的列表。
我的结论是一定有什么东西阻止 Hibernate 遍历我的流水线函数的结果集。它返回正确的行数,但它卡在第一行并一遍又一遍地创建该对象。
这个问题似乎与我的列映射无关
【问题讨论】:
-
你能显示你的查询吗?
-
@fg78nc 我添加了一个示例。这是为了工作,我不能发布明确的代码。我在存储过程中调用流水线函数。我的实体类映射到流水线函数返回的列名。当我不提供我的实体类时,一切正常。但是当我提供它时,它只会重复相同的对象。该对象是流水线函数返回的第一行。
-
SQL 字符串中的列别名是否与单个实体的列映射直接匹配?
-
@fg78nc 我正在使用
select *,没有别名。并且所有列都正确映射,否则我不会从.getResultsList()得到任何返回。 -
尝试添加显式ResultSet映射,请看我的回答
标签: java hibernate jpa entitymanager javax.persistence