![](/img/trans.png)
[英]mybatis select latest primary key after insert record in PostgreSQL 13
[英]MyBatis 3 + PostgreSQL - get primary key value on insertion
我有一個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配置,以嘗試從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。
我認為您需要將keyProperty的大小寫更改為具有合適設置程序的id
setId(int value);
AFAIK,無法為大寫字段創建與Javabeans兼容的setter。
但是,您看到的返回值是插入的行數,而不是分配的主鍵值。 MyBatis似乎沒有辦法利用有用的(但非標准的)返回子句。
要獲取鍵值,您需要在selectKey
聲明中使用order=
選項。 這個問題對於PostgreSQL有幾個選項。 從MyBatis“ <插入>”映射的方法返回值 。所描述的技術將更新提供給該方法的對象中的id
字段。
我使用的是Oracle數據庫,因此沒有資格推薦PostgreSQL的答案。 但要注意的是,如果order="BEFORE"
選項適用於PostgreSQL,則它與Oracle兼容。
我發現我的問題是我有兩列帶有“ id”的列。 MyBatis試圖將我的名為“ CognitoID”的列映射到普通的舊“ ID”列,並且在無法將Cognito ID轉換為int時崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.