使用 MyBatis mapper.xml 在 Postgresql 的 JSONB 字段内的同一查询中递增多个计数器

Using MyBatis mapper.xml to increment a multiple counters in the same query inside of a JSONB field in Postgresql

提问人:m4mmt 提问时间:11/16/2023 最后编辑:m4mmt 更新时间:11/19/2023 访问量:44

问:

我正在使用 Java + Spring + MyBatis + Postgresql。我有一个表,其中有一列(在 Java 中映射到),出于性能原因,我想使用相对于属性所属实体的查询进行更新。JSONBBIGINTLongmapper.xml

假设我具备以下要素:

  • table_a:数据库表
  • column_1:类型的列table_aJSONB
  • key_alpha:与值关联的字段column_1BIGINT

理想情况下,在纯语法中,我会执行以下操作来初始化此类值:psql

UPDATE table_a
SET column_1 = jsonb_set(column_1, '{key_alpha}', to_jsonb(0));

并按以下方法递增它:

UPDATE table_a
SET column_1 = jsonb_set(column_1, '{key_alpha}', to_jsonb((column_1->>'key_alpha')::bigint + 1));

问题在于,这个语法看起来与 MyBatis 映射器语法不兼容。我怎样才能使用 MyBatis 或替代方法实现这个结果,同时记住我需要一个性能关键的方法?xml

更具体地说,如果我尝试在以下情况下使用此语法:mapper.xml

<if test="incrementCountAlpha != null">column_1 = jsonb_set(column_1, '{key_alpha}', to_jsonb((column_1->>'key_alpha')::bigint + #{incrementCount})),</if>

<if test="incrementCountBeta != null">column_1 = jsonb_set(column_1, '{key_beta}', to_jsonb((column_1->>'key_beta')::bigint + #{incrementCount})),</if>

我收到以下错误;### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "column_1"

java postgresql 数据库设计 mybatis jsonb

评论

0赞 ave 11/16/2023
它对我有用。究竟发生了什么?如果有错误,请在问题中添加详细信息。
0赞 m4mmt 11/16/2023
@ave 我用我得到的特定错误更新了问题的正文
0赞 ave 11/16/2023
当该列在单个 UPDATE 语句中出现两次时,会发生该错误。请参阅此问答。要更新 JSONB 列的多个字段,似乎有几种不同的解决方案。这个看起来很受欢迎。column_1

答:

0赞 ave 11/19/2023 #1

以下语句应该可以实现您的目标。

<update id="updateColumn1">
  update table_a set column_1 = column_1
  <if test="incrementCountAlpha != null">
    || jsonb_build_object(
      'key_alpha',
      coalesce((column_1->>'key_alpha')::bigint, 0) + #{incrementCountAlpha})
  </if>
  <if test="incrementCountBeta != null">
    || jsonb_build_object(
      'key_beta',
      coalesce((column_1->>'key_beta')::bigint, 0) + #{incrementCountBeta})
  </if>
</update>

COALESCE如果保证事先初始化目标字段,则可能没有必要。

下面是一个可执行的演示项目:
https://github.com/harawata/mybatis-issues/tree/master/so-77490757