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

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实体:

  1. 首先定义投影接口
public interface StateProjection {
    String getState();
    Integer getAdmission_number();
}
  1. 修改Repository方法返回类型
// StateRepository.java
@Query(value="SELECT state, admission_number FROM state", nativeQuery=true)
List<StateProjection> findDatos();
  1. 同步修改Controller层的返回类型
// StateController.java
@GetMapping("/getDatosEspecial") 
public List<StateProjection> getbyspeccial(){
    return stateRepository.findDatos();
}

方案3:使用JPQL+自定义构造方法映射

也可以不使用原生SQL,通过JPQL指定构造方法直接映射为State实体:

  1. 给State实体类添加对应参数的构造方法
// State.java 新增构造方法
public State(String state, int admission_number) {
    this.state = state;
    this.admission_number = admission_number;
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:27:03