关于java:JPA createNativeQuery不映射到Entity类

JPA createNativeQuery not mapping to Entity class

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

当我这样做

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

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

enter image description here

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

但是如果我这样做

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

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

enter image description here

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

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

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

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

更新

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

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

我的结论是,必须阻止Hibernate遍历管道函数的结果集。它返回正确的行数,但是卡在第一行,只是一遍又一遍地创建该对象。

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


解决了。

事实证明,我只是不专心致志而已。

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

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


您能否尝试提供明确的结果集映射

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

然后

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

您是否尝试过使用类似的东西?

1
2
3
4
5
StoredProcedureQuery q = em.createStoredProcedureQuery("stored_procedure_name");
q.registerStoredProcedureParameter("empList", something.class, ParameterMode.REF_CURSOR);

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