1

我正在尝试使用 createNativeQuery 从我的数据库中获取结果集并将其映射到实体对象列表。

当我做

List<MyObject> results = this.em.createNativeQuery(query, MyClass.class).getResultList();

我最终得到一个大小正确的实体对象数组,并正确映射到列,但它们都是同一个对象。返回的第一个结果对于我列表中的每个条目都是重复的。

在此处输入图像描述

在上图中,您可以看到我取回了数据,如果我检查 ovbject,它们会正确映射到我的列。但它们都是同一个对象。

但如果我这样做

List<Object[]> objects = this.em.createNativeQuery(query, Object.class).getResultList();

我得到了应有的不同对象的列表。但它们没有映射到我的 Entity 类。

在此处输入图像描述

在上面的图片中,您可以看到,当我使用ObjectEntity 类类型而不是我的 Entity 类类型时,我得到了返回的每一行的不同对象的结果集。我不知道为什么当我使用我的实体类时它只是一遍又一遍地重复同一行。

有谁知道是什么导致我每次都获得相同对象的列表?

我的查询是从存储过程中的流水线函数中选择

String query = "select * from table(myschema.mypackage.myfunction(input_var))";

更新

我在我的过程中调用的流水线函数返回大约 200 行。出于测试目的,我只映射了前几列。

我的 Entity 类具有 200 列中的前 13 列的列映射。我调用该函数的查询正在执行 a select *,因此,它返回所有 200 列并映射前 13 列。我认为这是一个可能的问题,但我只是用我创建的新测试类并select *从常规执行将表转换为仅映射了 2 个列的实体。没有问题。它返回一个不同对象的列表。

我的结论是,一定有什么东西阻止 Hibernate 遍历我的流水线函数的结果集。它返回正确的行数,但它卡在第一行并一遍又一遍地创建该对象。

这个问题似乎与我的列映射无关

4

3 回答 3

2

解决了。

原来我只是没有注意并过度思考我做了什么。

@Id在我的实体类中的一个列上的注释结果并不明显。当我检查我的工作时,我只注意返回的列表的大小。

将 my 固定@Id在右列后,它现在返回不同对象的完整列表。

于 2017-07-13T20:09:00.233 回答
0

你能尝试提供明确的结果集映射吗

@SqlResultSetMapping(
    name="myMapping",
    entities={@EntityResult(entityClass=MyClass.class)}

接着

em.createNativeQuery(query, "myMapping").getResultList();
于 2017-07-13T17:45:56.457 回答
0

你试过用这样的东西吗?

StoredProcedureQuery q = em.createStoredProcedureQuery("stored_procedure_name");
q.registerStoredProcedureParameter("empList", something.class, ParameterMode.REF_CURSOR);

List<MyObject> myObj= (List<>)q.getOutputParameterValue("paramValue");
// ...
于 2017-07-13T17:37:04.670 回答