Spring Boot调用存储过程映射Entity返回无字段名及重复值问题咨询
问题1:接口返回纯值数组、无字段名的解决方法
你最初的调用代码没有指定结果映射类,JPA无法将存储过程返回的结果集映射为Users实体对象,只会返回List<Object[]>类型的原始结果,序列化后自然只有值没有对应字段名。
你后续将代码修改为:
StoredProcedureQuery q = entityManager.createStoredProcedureQuery("userslist",Users.class);
已经解决了这个问题,显式指定结果类后,JPA会自动将结果集映射为Users实体对象,序列化后就会携带字段名。
小提醒:你定义
@NamedNativeQuery的代码里,name="userslist"后面用了点号,应该修改为逗号,避免编译错误。
问题2:修改后出现重复大小写字段的原因及解决方案
出现该问题通常是以下几个原因导致的,你可以逐一排查:
- 原因1:
Users实体类缺少@Id主键注解
JPA规范要求所有标注了@Entity的类必须至少有一个标注@Id的主键字段,缺少主键会导致ORM映射逻辑异常,出现字段重复映射的问题。你需要给Users类加上主键字段和对应的@Id注解。 - 原因2:实体字段、getter方法命名不规范,同时Jackson序列化策略未统一
你返回的重复字段分别是大写开头的Firstname和小写开头的firstname,通常是因为Jackson同时序列化了实体的字段本身和getter方法的返回值:- 检查你的实体字段是否设置为
public修饰,建议将字段设置为private,仅保留getter/setter方法访问 - 检查getter方法命名是否规范,比如
firstname字段对应的getter应该是getFirstname(),避免命名不统一导致的序列化重复 - 如果存储过程返回的列名是大写开头,可以在对应的
@Column注解中显式指定name属性,同时在Spring Boot配置文件中添加Jackson序列化策略配置,统一字段名小写开头:
spring.jackson.property-naming-strategy=LOWER_CAMEL_CASE - 检查你的实体字段是否设置为
- 原因3:实体类字段拼写错误
你当前代码中的字段名写的是fistname,比正确的firstname少了一个字母r,如果@Column注解中写的是正确的firstname,就会出现映射错误导致重复字段,修正拼写即可。
内容的提问来源于stack exchange,提问作者newcoder
相关产品推荐
相关产品推荐

