Mybatis - 在Upsert上返回ID

时间:2018-03-31 14:52:19

标签: postgresql mybatis ibatis upsert

我有一个配置的语句看起来像这样(在这里解释,没有在我面前的实际代码):

<insert id="createRecord" parameterType="map">
  INSERT INTO MYTABLE (id, name, creator, description)
  VALUES (#{id}, #{name}, #{creator}, #{description})
  ON CONFLICT ON CONSTRAINT (name, creator)
  DO UPDATE SET
    name = #{name},
    creator = #{creator},
    description = #{description}
</insert>

现在存在,应用程序代码通过调用mybatis / postgres生成id本身来获取下一个序列值,然后将其传递给createRecord

我想重构此代码,以便在id中创建createRecord。据我所知,一种方法是用#{id}替换语句中的nextval('my_seq')。另一种方法是使用selectKey

<insert id="createRecord" parameterType="map">
  <selectKey keyProperty="id" resultType="long">
    select nextval('my_seq')
  </selectKey>
  INSERT INTO MYTABLE (id, name, creator, description)
  VALUES (#{id}, #{name}, #{creator}, #{description})
  ON CONFLICT ON CONSTRAINT (name, creator)
  DO UPDATE SET
    name = #{name},
    creator = #{creator},
    description = #{description}
</insert>

我希望能够在两种情况下都将id的值作为返回值;是否是新记录并生成了新的序列ID,或者是否存在冲突/更新,现有ID。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

如果你重写这样的查询,你可以返回id:

<select id="createRecord" parameterType="map" resultType="long" flushCache="true">
  INSERT INTO MYTABLE (id, name, creator, description)
  VALUES (nextval('my_seq'), #{name}, #{creator}, #{description})
  ON CONFLICT ON CONSTRAINT (name, creator)
  DO UPDATE SET
    name = #{name},
    creator = #{creator},
    description = #{description}
  RETURNING id
</insert>

此查询现在看起来像选择查询,它返回结果,应该映射为常规选择查询(但应使用flushCache,因为它不是只读查询)。