【问题标题】:JPA createNativeQuery not mapping to Entity classJPA createNativeQuery 未映射到实体类
【发布时间】: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


【解决方案1】:

解决了。

事实证明,我只是没有注意并过度思考我做了什么。

我的 Entity 类中有我的 @Id 注释,但结果并不明显。当我检查我的工作时,我只注意返回的列表的大小。

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

【讨论】:

  • 哦,那个帮了忙!几天收到错误的结果,不知道它来自哪里。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    然后

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

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2011-07-13
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2013-01-22
      • 2011-10-20
      相关资源
      最近更新 更多