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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:24:46