Spring:JPA 将原生 SQL 转换为非实体 pojo

Posted

技术标签:

【中文标题】Spring:JPA 将原生 SQL 转换为非实体 pojo【英文标题】:Spring : JPA to convert native SQL to non entity pojo 【发布时间】:2017-06-08 05:50:41 【问题描述】:

我有返回对象集合的本机 SQL,我希望将结果作为对象集合(一个非实体的 pojo 类)

is it possible to get the results from native SQL as collection of non entity?

I am using spring jpa 1.10

【问题讨论】:

您在寻找SqlResultSetMapping吗?它仅适用于 JPA 2.1 或更高版本。 如果不使用 JPA 2.1,那么它取决于您的 JPA 提供程序,但您没有说您使用的是哪一个。我知道 DataNucleus 在 JPA 2.1 之前支持这种转换 【参考方案1】:

在 JPA 1 中无法映射非实体类。

从 JPA 2.1 开始,您可以使用 ConstructorResult,与 SqlResultSetMapping 注释结合使用,将 SQL 查询的 SELECT 子句映射到构造函数。

这是一个例子

Query q = em.createNativeQuery(
      "SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS avgOrder " +
      "FROM Customer c, Orders o " +
      "WHERE o.cid = c.id " +
      "GROUP BY c.id, c.name",
      "CustomerDetailsResult");

   @SqlResultSetMapping(
       name="CustomerDetailsResult",
       classes=
          @ConstructorResult(
               targetClass=com.acme.CustomerDetails.class,
                 columns=
                    @ColumnResult(name="id"),
                    @ColumnResult(name="name"),
                    @ColumnResult(name="orderCount"),
                    @ColumnResult(name="avgOrder", type=Double.class)
                    
          )
       
      )

【讨论】:

谢谢 是否可以命名查询并映射 pojo? @SAR concretepage.com/hibernate/native_query_hibernate_annotation 可能会帮助你 @harshavmb 谢谢,但我所拥有的是非实体,这就是问题出现的地方:) @SAR 其实只需要配置查询名称即可。对于 NamedQuery,有一个 resultClass 参数(记住,你可以试一试)。 @LipingHuang 不,它没有用,我也试过了。 :),问题在于它不是实体,这就是所有这些问题出现的原因【参考方案2】:

Mapping NativeQuery results into a POJO - 这是使用 @JsonFormat 和 ObjectMapper 的独立于 JPA 的解决方案,详细说明了 @darshan-patel 已经提到的代码示例。

【讨论】:

以上是关于Spring:JPA 将原生 SQL 转换为非实体 pojo的主要内容,如果未能解决你的问题,请参考以下文章

如何使用条件(where子句)更新实体并在spring数据jpa中的方法响应中获取更新的实体

指定为非空的参数为空:无法更新 Spring Boot jpa 中的单个实体字段。导致指定为非空的参数为空

Spring Data JPA 原生查询结果实体

Spring Data JPA 将原生查询结果映射到非实体 POJO

JPA EntityManager查询--使用原生sql 并且把查询结果转为实体对象

JPA EntityManager查询--使用原生sql 并且把查询结果转为实体对象