JPA createNativeQuery未映射到实体类

时间:2017-07-13 17:21:39

标签: java hibernate jpa entitymanager javax.persistence

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

当我做的时候

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

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

enter image description here

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

但如果我这样做

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

我得到了一个不同的对象列表,就像它应该的那样。但是它们没有映射到我的Entity类。

enter image description here

在上面的图片中,您可以看到当我使用Object而不是我的Entity类类型时,我会为返回的每一行获得不同对象的结果集。我无法弄清楚为什么当我使用我的Entity类时,它只是一遍又一遍地重复相同的行。

有没有人知道什么可能导致我每次都得到同一个对象的列表?

我的查询是从存储过程中的Pipelined函数中选择

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

更新

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

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

我的结论是必须有一些东西阻止Hibernate迭代我的流水线函数的结果集。它返回正确的行数,但它会卡在第一行,只是一遍又一遍地创建该对象。

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

3 个答案:

答案 0 :(得分:1)

解决了它。

原来我只是没有注意并且没有考虑我做了什么。

我的Entity类中的@Id注释在一个列上显示并不明显。当我检查我的工作时,我只关注返回列表的大小。

将我的@Id修复到右栏后,它现在返回不同对象的完整列表。

答案 1 :(得分:0)

您是否尝试使用此类内容?

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

List<MyObject> myObj= (List<>)q.getOutputParameterValue("paramValue");
// ...

答案 2 :(得分:0)

您可以尝试提供显式的结果集映射

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

然后

em.createNativeQuery(query, "myMapping").getResultList();