使用 Spring Data JPA 将 sql 查询的结果映射到 pojo

Posted

技术标签:

【中文标题】使用 Spring Data JPA 将 sql 查询的结果映射到 pojo【英文标题】:Map result of a sql query to pojo using spring Data JPA 【发布时间】:2020-05-13 22:17:51 【问题描述】:

我是一名学习 Spring data jpa 的学生。我正在尝试解决一些练习编码问题。我有一个我找不到答案的问题。 我有一个名为 MYDB 的数据库表,其中包含以下字段:

(id, firstname, lastname, rollno, major, country)

我有一个这样的 sql 查询:

select Count(*) as counts, lastname as last_name, major as major_field from MYDB group by country

上述查询返回三个字段:counts(不是 db 列)、last_name 和 major_field。

我有一个这样的 POJO:

public class MyPojo 
    private int counts;
    private String lastName;
    private String majorField;

    // Getters and Setters of all data members here
    ...................

我的问题是如何将我从 sql 查询得到的结果映射到我的 POJO?我需要分配:

counts = counts(from sql query), lastName = last_name(from sql query), majorField = major_field(from sql query).

我被困在这一点上,不知道如何进一步实现将 sql 查询的结果映射到 POJO:

public interface MyRepo extends JpaRepository<MyPojo, String> 
    @Query(value=MY_SQL_QUERY, nativeQuery = true)
    List<MyPojo> findAll();

最终我需要将 MyPojo 转换为 Json 对象,但我知道如何做这部分。我只是不知道将 sql 查询的结果分配给 pojo。

【问题讨论】:

这解决了问题:baeldung.com/… 【参考方案1】:

使用 javax.persistence @Column 注释指定查询中的哪些值用于填充 Java 对象的字段:

public class MyPojo 

    @Column(name = "counts")
    private int counts;

    @Column(name = "last_name")
    private String lastName;

    ... and so on

这里有一个很棒的注释教程:

https://www.javaworld.com/article/3373652/java-persistence-with-jpa-and-hibernate-part-1-entities-and-relationships.html

【讨论】:

【参考方案2】:

你必须使用 TypedQuery 并给出你的类名来执行和映射你的查询结果到 pojos

【讨论】:

【参考方案3】:

使用基于接口的投影解决的问题:

https://www.baeldung.com/jpa-queries-custom-result-with-aggregation-functions#solution_interface_jpa

【讨论】:

以上是关于使用 Spring Data JPA 将 sql 查询的结果映射到 pojo的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA 之 原生SQL使用

spring-data-jpa的简单使用动态sql分页排序

JavaEE 之 Spring Data JPA

带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表

如何通过 Sum SQL 与 Spring Data JPA 一起使用组?

使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句