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 将原生查询结果映射到非实体 POJO