当前位置: 首页 > 知识库问答 >
问题:

Mybatis-上传时返回ID

甘英光
2023-03-14

我配置了一个类似以下内容的语句(在这里进行解释,前面没有实际的代码):

<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

我想重构此代码,以便在createRecord中创建id。据我所知,一种方法是将语句中的#{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个答案

闻人伟
2023-03-14

如果将查询重写为以下内容,则可以返回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,因为它不是只读查询)。

 类似资料:
  • 以下是我的myBatis请求,它应该返回一个列表: 有时请求返回“null”而不是空列表。得到后,我有一个检查块: 我的有时会生成NPE,因为null而不是大小为0的列表。什么会是问题?

  • 我有如下疑问, 我通过如下传递值来调用服务方法。 但它回来了。。。[] 帮助我为什么我没有得到值,而是得到了空列表。 附言:我检查了日志,它的语句是创建的,没有任何问题

  • 本文向大家介绍Mybatis中返回Map的实现,包括了Mybatis中返回Map的实现的使用技巧和注意事项,需要的朋友参考一下 在Mybatis中,我们通常会像下边这样用: 返回一个结果 返回多个结果(其实这个和上边一样,只不过是查询条件的控制而已) 我们只要将上边的resultType改为java.util.HashMap,这会有生成下边这样 上这结果就是说,以User类的属性名为key,属性值

  • 我在mybatis中使用了下面的插入查询。在ibatis中,相同的查询seq_consumer_id.nextval返回到java中的调用方法,并将其插入到consumer_id列中。但是在mybatis中,方法的返回值始终为1(我假设它是插入行的编号),尽管consumer_id列是从序列中正确更新的。我们不能生成密钥,插入它并将其返回到mybatis中的java类吗?

  • 有没有办法让预签名的aws上传URL在出现错误时返回json响应,而不是xml响应。 目前,如果url过期,它会返回如下内容。 如果这是json响应就好了。