Spring中JdbcTemplate查询Reader对象id始终为0的问题求助
问题解决方法
1. 修正实体类笔误
你的Reader实体类存在明显拼写错误:private Stringname;需改为private String name;,该错误会导致属性无法正常赋值甚至编译失败。
修正后的实体类片段:
public class Reader { private int id; @NotEmpty(message = "Name shouldn't be empty!") @Size(min = 2, max = 100, message = "Name should be between 2 and 100 characters!") private String name; // 修正拼写错误 @Min(value = 0, message = "Age should be greater than 0!") private int age; // 构造方法、getter/setter... }
2. 解决id字段映射问题
数据库中字段名为reader_id,但实体类属性为id,BeanPropertyRowMapper默认按驼峰命名规则匹配列名与属性名(如reader_id会匹配readerId属性),因此无法将reader_id的值映射到id属性,导致int类型的id始终取默认值0。可通过以下三种方案解决:
方案一:修改SQL语句给字段起别名
在查询SQL中将reader_id别名为id,让BeanPropertyRowMapper直接匹配实体类的id属性:
public Reader getReader(int id){ return jdbcTemplate.queryForObject( "SELECT reader_id AS id, name, age FROM reader WHERE reader_id=?", new BeanPropertyRowMapper<>(Reader.class), id ); }
方案二:使用@Column注解指定列名
给实体类的id字段添加@Column注解,明确对应数据库列名(需引入Spring Data JPA相关依赖):
import jakarta.persistence.Column; public class Reader { @Column(name = "reader_id") // 指定对应数据库的reader_id列 private int id; // 其他属性... }
方案三:自定义RowMapper手动映射
若不想依赖JPA注解,可自定义RowMapper手动完成字段到属性的映射:
public Reader getReader(int id){ return jdbcTemplate.queryForObject( "SELECT * FROM reader WHERE reader_id=?", (rs, rowNum) -> { Reader reader = new Reader(); reader.setId(rs.getInt("reader_id")); reader.setName(rs.getString("name")); reader.setAge(rs.getInt("age")); return reader; }, id ); }
验证修改
完成上述修改后重启项目,调用接口即可正常获取Reader的id值,不再输出0。
内容的提问来源于stack exchange,提问作者thssnhtnsxt
相关产品推荐
相关产品推荐

