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
相关产品推荐
相关产品推荐

