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

Spring Data R2DBC操作PostgreSQL:保存对象时获取生成ID方法

获取Spring Data R2DBC保存后的User实体

嘿,要获取保存后的User对象其实很简单,只需要在你的insert操作链上补充几个方法就能搞定,下面给你详细说明:

1. 修改保存方法的实现

你需要在using(user)之后,通过fetch().one()来获取插入后的数据库记录,再将其映射回User类型。这里有两种写法供你选择:

写法一:手动映射行数据

适合需要自定义映射逻辑的场景:

public Mono<User> save(User user){
    return databaseClient().inTransaction(db -> {
        return db
            .insert()
            .into(User.class)
            .using(user)
            .fetch() // 触发SQL执行并获取结果集
            .one() // 获取插入后的单条记录
            .map(row -> {
                User savedUser = new User();
                savedUser.setId(row.get("id", Long.class));
                savedUser.setName(row.get("name", String.class));
                return savedUser;
            });
    });
}

写法二:自动映射为实体类

如果你的实体类和数据库字段匹配度很高,用这种写法更简洁(需要Spring Data R2DBC 1.1+版本支持):

public Mono<User> save(User user){
    return databaseClient().inTransaction(db -> {
        return db
            .insert()
            .into(User.class)
            .using(user)
            .as(User.class) // 指定要转换的目标实体类型
            .fetch()
            .one();
    });
}

2. 确保自增ID能被正确返回

如果你的PostgreSQL中id字段是自增类型(比如SERIAL或者GENERATED AS IDENTITY),别忘了给实体类的@Id字段加上@GeneratedValue注解,这样R2DBC才能自动捕获数据库生成的ID:

@Data 
@AllArgsConstructor 
@NoArgsConstructor
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 新增该注解
    private Long id;
    private String name;
}

完成以上修改后,你的save方法就会返回包含完整信息(包括自动生成的ID)的User对象啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:57:33