我正在尝试使用createNativeQuery从我的数据库中获取结果集并将其映射到Entity对象列表。
当我做的时候
List<MyObject> results = this.em.createNativeQuery(query, MyClass.class).getResultList();
我最终获得了一个正确大小的Entity对象数组,并正确映射到列,但它们都是相同的对象。返回的第一个结果对于列表中的每个条目都是重复的。
在上面的图片中,您可以看到我获取数据,如果我检查ovbject,它们会正确地映射到我的列。但它们都是同一个对象。
但如果我这样做
List<Object[]> objects = this.em.createNativeQuery(query, Object.class).getResultList();
我得到了一个不同的对象列表,就像它应该的那样。但是它们没有映射到我的Entity类。
在上面的图片中,您可以看到当我使用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迭代我的流水线函数的结果集。它返回正确的行数,但它会卡在第一行,只是一遍又一遍地创建该对象。
这个问题似乎与我的列映射无关
答案 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();