我配置了一个类似以下内容的语句(在这里进行解释,前面没有实际的代码):
<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。如何执行此操作?
如果将查询重写为以下内容,则可以返回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响应就好了。