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

使用JDBI的mapToBean时无法自动映射嵌套类PaCategory的问题

解决JDBI映射嵌套实体类时paCategory为null的问题

问题根源

JDBI的mapToBean方法仅支持扁平结果集到实体类的直接映射,无法自动识别并填充嵌套的PaCategory对象,因此会导致paCategory始终为null。

解决方案一:使用JoinRowMapper关联映射

适用于JDBI 3.x及以上版本,通过JoinRowMapper分别映射主实体和嵌套实体,再手动关联:

  1. 调整SQL查询,为嵌套实体的字段添加前缀(避免字段名冲突):
SELECT 
    c.category_id,
    c.name,
    c.pa_category_id,
    pa.pa_category_id AS pa_pa_category_id,
    pa.name AS pname 
FROM category c 
JOIN pa_category pa ON pa.pa_category_id = c.pa_category_id 
WHERE category_id=2
  1. 使用JoinRowMapper和BeanMapper实现映射:
List<Category> categories = JDBIConnector.get().withHandle(handle -> {
    return handle.createQuery("SELECT c.category_id,c.name,c.pa_category_id,pa.pa_category_id AS pa_pa_category_id,pa.name AS pname FROM category c JOIN pa_category pa ON pa.pa_category_id = c.pa_category_id WHERE category_id=2")
            .map(JoinRowMapper.join(
                    BeanMapper.of(Category.class),
                    BeanMapper.of(PaCategory.class).withPrefix("pa_")
            ))
            .map(row -> {
                Category category = row.get(Category.class);
                PaCategory paCategory = row.get(PaCategory.class);
                category.setPaCategory(paCategory);
                return category;
            })
            .list();
});

解决方案二:自定义RowMapper手动映射

通过实现RowMapper接口,手动读取结果集字段并填充嵌套对象:

  1. 自定义RowMapper类:
public class CategoryRowMapper implements RowMapper<Category> {
    @Override
    public Category map(ResultSet rs, StatementContext ctx) throws SQLException {
        Category category = new Category();
        category.setCategoryId(rs.getInt("category_id"));
        category.setPaCategoryId(rs.getInt("pa_category_id"));
        category.setName(rs.getString("name"));

        PaCategory paCategory = new PaCategory();
        paCategory.setPaCategoryId(rs.getInt("pa_category_id"));
        paCategory.setPname(rs.getString("pname"));
        category.setPaCategory(paCategory);

        return category;
    }
}
  1. 查询时使用自定义Mapper:
List<Category> categories = JDBIConnector.get().withHandle(handle -> {
    return handle.createQuery("SELECT c.category_id,c.name,c.pa_category_id,pa.pa_category_id,pa.name pname FROM category c JOIN pa_category pa ON pa.pa_category_id = c.pa_category_id WHERE category_id=2")
            .map(new CategoryRowMapper())
            .list();
});

注意事项

  • 确保SQL查询返回的字段名与实体类的属性名匹配,必要时通过别名调整
  • 嵌套对象的属性必须手动赋值,JDBI默认不支持自动嵌套映射

内容的提问来源于stack exchange,提问作者Dương Thanh Phụng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:05:23