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
相关产品推荐
相关产品推荐

