我有一个配置的语句看起来像这样(在这里解释,没有在我面前的实际代码):
<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。我怎么能这样做?
答案 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
,因为它不是只读查询)。