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

