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

MyBatis UPDATE语句使用RETURNING返回指定值的问题

解决MyBatis中UPDATE语句返回指定值的问题

问题原因

你当前返回-1是因为MyBatis默认情况下,update标签对应的接口方法返回的是受影响的行数,但当使用PostgreSQL的RETURNING子句时,驱动会返回结果集而非单纯的行数,此时用int类型接收就会得到异常值(比如-1)。

正确实现方式

MyBatis完全支持从UPDATE语句返回指定值,核心是利用RETURNING返回的结果集,通过以下步骤实现:

  1. 修改Mapper接口的返回类型
    把原来返回int的方法改成返回你需要的字符串类型,同时给参数加上@Param注解确保映射正确:

    String updateRoleValues(
        @Param("roleId") int roleId,
        @Param("roleName") String roleName,
        @Param("description") String description,
        @Param("active") boolean active
    );
    
  2. 调整XML中的SQL标签
    将原来的<update>标签替换为<select>标签(因为RETURNING会生成结果集,select标签可以直接映射结果),并指定resultType为字符串类型,同时修改RETURNING后的列名为你需要的唯一字符串列:

    <select id="updateRoleValues" resultType="java.lang.String">
        UPDATE sandbox.roles
        SET rolename    = #{roleName},
            description = #{description},
            active      = #{active},
            obsolete    = false
        WHERE role_id = #{roleId} RETURNING your_unique_string_column
    </select>
    

    (把your_unique_string_column替换成你实际要返回的字符串类型唯一值的列名)

效果说明

  • 当存在匹配roleId的记录时,方法会返回RETURNING指定列的字符串值;
  • 当没有匹配的记录(即未执行更新)时,方法返回null。

另一种可选方式(用<update>+<selectKey>)

如果坚持要用<update>标签,可以通过<selectKey>来捕获返回值,但需要用Map或自定义对象作为参数来承载返回结果:

<update id="updateRoleValues" parameterType="map">
   <selectKey keyProperty="returnedUniqueValue" resultType="java.lang.String" order="AFTER">
       UPDATE sandbox.roles
       SET rolename    = #{roleName},
           description = #{description},
           active      = #{active},
           obsolete    = false
       WHERE role_id = #{roleId} RETURNING your_unique_string_column
   </selectKey>
</update>

调用时传入包含所有参数的Map,执行后可以从Map中取出returnedUniqueValue对应的结果。不过这种方式不如<select>标签直接返回结果直观。

内容的提问来源于stack exchange,提问作者Mark Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:45:22