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

BeanPropertyRowMapper使用AS关键字映射字段时为何报错?

问题原因及解决方案

核心问题:基本类型无法接收NULL值

你的SQL用了左连接people表,当books表的people_id没有对应people记录时,查询结果里的personId(对应people.id)和personName(对应people.name)会返回NULL。但Book类中personId是基本类型int,而int无法存储NULL值,这就是BeanPropertyRowMapper映射报错的直接原因。

解决方案

1. 把基本类型改为包装类

将Book类里的personId字段从int替换为Integer,包装类可以正常接收NULL值:

private int id;

@NotEmpty (message = "Name should not be empty")
@Size (min = 2, max = 255, message = "Name should be correct")
private String name;

@NotEmpty (message = "Field author should not be empty")
@Size (min = 2, max = 255, message = "Field author should be correct")
private String author;

@Min(value = 0)
private int year;

private int peopleId;

private Integer personId; // 替换原int类型
private String personName;

2. 确认别名与属性setter匹配

BeanPropertyRowMapper是通过JavaBean的setter方法映射字段的,比如别名peopleId会对应setPeopleId()方法。你的字段命名符合驼峰规则,编译器会自动生成对应setter,这部分无需额外调整,但如果自定义了setter,要确保方法名和别名的驼峰规则一致。

3. 复杂场景:手动实现RowMapper控制映射

如果需要更精准的映射逻辑,可以放弃BeanPropertyRowMapper,手动实现RowMapper:

public Book showBook(int id) {
    return jdbcTemplate.query(
        "SELECT books.id , books.name, books.author, books.year, books.people_id as peopleId, people.id as personId, people.name as personName FROM books LEFT JOIN people ON books.people_id = people.id WHERE books.id = ?",
        new Object[]{id},
        (rs, rowNum) -> {
            Book book = new Book();
            book.setId(rs.getInt("id"));
            book.setName(rs.getString("name"));
            book.setAuthor(rs.getString("author"));
            book.setYear(rs.getInt("year"));
            book.setPeopleId(rs.getInt("peopleId"));
            // 处理NULL值:先判断是否为NULL再赋值
            book.setPersonId(rs.getObject("personId") != null ? rs.getInt("personId") : null);
            book.setPersonName(rs.getString("personName"));
            return book;
        }
    ).stream().findAny().orElse(null);
}

验证建议

测试一条没有关联people记录的book数据,确认映射过程不会再报错;同时检查所有可能返回NULL的字段,对应的Java类字段是否都用了包装类(如Integer、Long等)。

内容的提问来源于stack exchange,提问作者Vandal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:45:29