如何从Single<UpdateResult>获取PostgreSQL UPDATE RETURNING返回值?
解决PostgreSQL中带RETURNING的UPDATE语句获取返回值的问题
你这里的核心问题是**rxUpdateWithParams返回的UpdateResult并不承载RETURNING子句返回的结果集**——它的设计只是用来提供更新操作的元数据(比如更新了多少行、受影响的键等),这就是为什么你看到的只有updated=1和空keys的原因。
而rxQueryWithParams之所以能在插入时拿到结果,是因为INSERT ... RETURNING本质上会返回一个结果集,这个方法正是用来处理这类带结果返回的SQL操作的,同样的逻辑也适用于UPDATE ... RETURNING。
解决方案:用rxQueryWithParams执行带RETURNING的UPDATE
你只需要把原来的rxUpdateWithParams替换成rxQueryWithParams,然后从返回的ResultSet中提取RETURNING指定的字段即可。修改后的代码如下:
更新方法改写
public Single<String> update(UpdateEventRequest request) { String sta_cd = request.getStaCd(); String id = request.getId(); return client.rxQueryWithParams( "UPDATE mydb.sample SET sta_cd=?, some_ts=current_timestamp WHERE id=? RETURNING sta_cd", new JsonArray(Arrays.asList(sta_cd, id)) ) .map(resultSet -> { // 从结果集中提取返回的sta_cd if (resultSet.getRows().size() > 0) { return resultSet.getRows().get(0).getString("sta_cd"); } // 如果没有匹配到行,可以返回默认值或者抛出异常 throw new NoSuchElementException("No row updated with id: " + id); }); }
订阅代码调整
Single<String> result = someClass.update("10012", "78632"); result.subscribe( staCd -> { System.out.println("success: 返回的sta_cd是 " + staCd); }, // 现在能拿到10012了 error -> { System.out.println("error: " + error); } );
为什么这样可行?
PostgreSQL的RETURNING子句会让UPDATE(或INSERT/DELETE)操作返回受影响行的指定字段,这个返回内容和普通SELECT查询的结果集结构完全一致。因此用处理查询的rxQueryWithParams来执行这类语句,就能正确获取到返回的值,而不是只能拿到更新统计数据的UpdateResult。
如果你的场景需要同时获取更新行数和返回的字段,也可以在map方法里同时处理resultSet的元数据(比如resultSet.getUpdateCount()),把结果封装成一个自定义的DTO对象返回。
内容的提问来源于stack exchange,提问作者karvai
相关产品推荐
相关产品推荐

