You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中EntityManager查询结果转JSON格式问题求助

解决NativeQuery返回结果映射到POJO的问题

嘿,我来帮你搞定这个格式转换的麻烦!你现在用EntityManager.createNativeQuery执行原生SQL后,得到的是二维Object数组列表,这是因为默认情况下JPA不会自动把原生查询结果映射到你的PatientModel实体类上。下面有几个简单好用的解决方案:

方法1:直接指定实体类(最简单)

使用createNativeQuery的重载方法,第二个参数传入你的PatientModel类,JPA会自动帮你把查询结果映射成实体对象列表:

public List<PatientModel> fetchallpatients (){
    // 第二个参数指定要映射的实体类
    Query q = entityManager.createNativeQuery("select * from patient p ", PatientModel.class);
    List<PatientModel> patientList = q.getResultList();
    System.out.println(patientList);
    return patientList;
}

注意:这个方法生效的前提是你的PatientModel类和数据库表的字段对应正确——要么字段名完全匹配,要么用@Column注解明确指定映射关系(比如@Column(name = "patient_name")对应表中的patient_name字段)。

方法2:用@SqlResultSetMapping自定义映射规则

如果你的原生SQL有复杂查询(比如多表关联),或者实体属性和表字段名不匹配,可以用@SqlResultSetMapping来精确控制映射规则:

首先在你的PatientModel实体类上添加映射配置:

@Entity
@SqlResultSetMapping(
    name = "PatientMapping",
    entities = @EntityResult(
        entityClass = PatientModel.class,
        fields = {
            @FieldResult(name = "id", column = "id"),
            @FieldResult(name = "patientname", column = "patientname"),
            @FieldResult(name = "patientphone", column = "patientphone"),
            // 把其他字段也按这个格式一一对应上
        }
    )
)
public class PatientModel {
    // 你的实体属性
    private Long id;
    private String patientname;
    private String patientphone;
    
    // 别忘了添加getter和setter方法!
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getPatientname() { return patientname; }
    public void setPatientname(String patientname) { this.patientname = patientname; }
    public String getPatientphone() { return patientphone; }
    public void setPatientphone(String patientphone) { this.patientphone = patientphone; }
}

然后在查询时指定这个映射的名称:

public List<PatientModel> fetchallpatients (){
    Query q = entityManager.createNativeQuery("select * from patient p ", "PatientMapping");
    List<PatientModel> patientList = q.getResultList();
    System.out.println(patientList);
    return patientList;
}

方法3:手动转换数组到实体类(适合特殊场景)

如果前面两种方法都不适用(比如需要对查询结果做额外处理),可以手动遍历Object数组,逐个转换成PatientModel实例:

public List<PatientModel> fetchallpatients (){
    Query q = entityManager.createNativeQuery("select * from patient p ");
    List<Object[]> resultList = q.getResultList();
    List<PatientModel> patientList = new ArrayList<>();
    
    for(Object[] row : resultList){
        PatientModel patient = new PatientModel();
        // 注意数组索引要和SELECT语句的字段顺序对应,类型也要匹配
        patient.setId((Long) row[0]);
        patient.setPatientname((String) row[1]);
        patient.setPatientphone((String) row[2]);
        // 其他字段依次赋值
        patientList.add(patient);
    }
    
    System.out.println(patientList);
    return patientList;
}

小提示:不管用哪种方法,都要确保你的PatientModel类有正确的@Entity注解,并且每个属性都有对应的getter和setter方法,这样后端返回的列表才能被正确序列化成前端需要的JSON键值对格式~

内容的提问来源于stack exchange,提问作者Abhishek P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:12:58