我有一个Maven项目,它使用Java Spring,MyBatis和MyBatis-Spring将对象映射到PostgreSQL数据库。我希望能够在插入新记录的同时查询主键的值,并且还没有找到有效的方法。我当前的实现没有返回正确的值;它似乎总是返回1.
这是查询器的映射器XML配置:
<insert id="registerNewUser" parameterType="com.hunter.databasejar.User">
<selectKey keyProperty="ID" resultType="int">
SELECT currval('"Users_ID_seq"')
</selectKey>
insert into "Users" ("Username", "FirstName", "LastName") values (#{username}, #{firstName}, #{lastName})
</insert>
在Java中,我写下以下内容,i的值始终为1.
int i = sqlSession.insert("UserMapper.registerNewUser", user);
我也尝试过改变XML配置来尝试&#34;返回&#34;来自SQL的语法,但总是得到i值为-1。
<insert id="registerNewUser" parameterType="com.hunter.databasejar.User">
insert into "Users" ("Username", "FirstName", "LastName") values (#{username}, #{firstName}, #{lastName}) returning "ID"
</insert>
我的项目正在使用MyBatis 3.2.4。
答案 0 :(得分:2)
我认为您需要使用合适的setter将keyProperty的大小写更改为 id
setId(int value);
AFAIK,无法为大写字段创建兼容Javabeans的setter。
但是您看到的返回值是插入的行数,而不是分配的主键值。 MyBatis似乎没有办法利用有用(但非标准)的返回子句。
要获取键值,您需要使用order=
声明中的selectKey
选项。这个问题为PostgreSQL Returning values from MyBatis <insert> mapped methods提供了几个选项。所描述的技术将更新提供给该方法的对象中的id
字段。
我使用的是Oracle数据库,因此没有资格推荐PostgreSQL的答案。但是作为旁注,如果order="BEFORE"
选项适用于PostgreSQL,它可以与Oracle兼容。
答案 1 :(得分:0)
我发现我的问题是我在其中的某个地方有两个带有“id”的列。 MyBatis试图将名为“CognitoID”的列映射到我的普通旧“ID”列,并在Cognito ID不能转换为int时将其炸毁。