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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:47:36