Spring Boot查询MySQL指定列state、admission_number报错如何解决
问题根因
你遇到的报错核心原因是原生SQL查询结果与返回值类型不匹配:
- 你编写的原生SQL仅查询
state、admission_number两个字段,查询实际返回的是Object[]类型的数组集合,而你在Repository中将方法返回值定义为List<State>,Spring Data JPA默认无法将仅包含两个字段的查询结果自动映射为完整的State实体对象,因此抛出了具有误导性的SQL语法类异常。 - 你添加
admission_date字段后提示admission_number不存在,本质是查询返回字段的顺序、数量和State实体的属性顺序不匹配,JPA映射时错位导致的误报。
解决方案
你可以根据业务需求选择以下任意一种方案修改:
方案1:查询全量字段返回完整实体
如果业务需要返回完整的State对象,直接将原生SQL改为查询全表字段即可:
// StateRepository.java @Query(value="SELECT * FROM state", nativeQuery=true) List<State> findDatos();
方案2:使用投影接收指定字段
如果仅需要state和admission_number两个字段,可以自定义投影接口接收结果,不需要返回完整State实体:
- 首先定义投影接口
public interface StateProjection { String getState(); Integer getAdmission_number(); }
- 修改Repository方法返回类型
// StateRepository.java @Query(value="SELECT state, admission_number FROM state", nativeQuery=true) List<StateProjection> findDatos();
- 同步修改Controller层的返回类型
// StateController.java @GetMapping("/getDatosEspecial") public List<StateProjection> getbyspeccial(){ return stateRepository.findDatos(); }
方案3:使用JPQL+自定义构造方法映射
也可以不使用原生SQL,通过JPQL指定构造方法直接映射为State实体:
- 给State实体类添加对应参数的构造方法
// State.java 新增构造方法 public State(String state, int admission_number) { this.state = state; this.admission_number = admission_number; }
- 修改Repository为JPQL查询
// StateRepository.java @Query("SELECT new co.edu.poli.model.State(s.state, s.admission_number) FROM State s") List<State> findDatos();
内容的提问来源于stack exchange,提问作者Initial Programmer
相关产品推荐
相关产品推荐

