Skip to content

Commit 03936d6

Browse files
committed
Related to #25. Ensure selectKey returns one value.
1 parent b38da71 commit 03936d6

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

src/main/java/org/apache/ibatis/executor/keygen/SelectKeyGenerator.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,12 @@ private void processGeneratedKeys(Executor executor, MappedStatement ms, Object
6060
// The transaction will be closed by parent executor.
6161
Executor keyExecutor = configuration.newExecutor(executor.getTransaction(), ExecutorType.SIMPLE);
6262
List<Object> values = keyExecutor.query(keyStatement, parameter, RowBounds.DEFAULT, Executor.NO_RESULT_HANDLER);
63-
if (values.size() == 1) {
64-
metaParam.setValue(keyProperty, values.get(0));
63+
if (values.size() == 0) {
64+
throw new ExecutorException("SelectKey returned no data.");
6565
} else if (values.size() > 1) {
66-
throw new ExecutorException("Select statement for SelectKeyGenerator returned more than one value.");
66+
throw new ExecutorException("SelectKey returned more than one value.");
67+
} else {
68+
metaParam.setValue(keyProperty, values.get(0));
6769
}
6870
}
6971
}

src/test/java/org/apache/ibatis/submitted/selectkey/SelectKeyTest.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.apache.ibatis.submitted.selectkey;
1717

18+
import org.apache.ibatis.exceptions.PersistenceException;
1819
import org.apache.ibatis.io.Resources;
1920
import org.apache.ibatis.jdbc.ScriptRunner;
2021
import org.apache.ibatis.session.SqlSession;
@@ -108,22 +109,33 @@ public void testInsertTable2() {
108109
}
109110
}
110111

111-
@Test
112-
public void testInsertTable3() {
112+
@Test(expected=PersistenceException.class)
113+
public void testSeleckKeyReturnsNoData() {
113114
SqlSession sqlSession = sqlSessionFactory.openSession();
114-
115115
try {
116116
Map<String, String> parms = new HashMap<String, String>();
117117
parms.put("name", "Fred");
118118
int rows = sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insertNoValuesInSelectKey", parms);
119119
assertEquals(1, rows);
120120
assertNull(parms.get("id"));
121+
} finally {
122+
sqlSession.close();
123+
}
124+
}
121125

126+
@Test(expected=PersistenceException.class)
127+
public void testSeleckKeyReturnsTooManyData() {
128+
SqlSession sqlSession = sqlSessionFactory.openSession();
129+
try {
130+
Map<String, String> parms = new HashMap<String, String>();
131+
parms.put("name", "Fred");
132+
sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insertTooManyValuesInSelectKey", parms);
133+
sqlSession.insert("org.apache.ibatis.submitted.selectkey.Table2.insertTooManyValuesInSelectKey", parms);
122134
} finally {
123135
sqlSession.close();
124136
}
125137
}
126-
138+
127139
@Test
128140
public void testAnnotatedInsertTable2() {
129141
SqlSession sqlSession = sqlSessionFactory.openSession();

src/test/java/org/apache/ibatis/submitted/selectkey/Table2.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,12 @@
3131
select * from table2 where name = 'xxx'
3232
</selectKey>
3333
</insert>
34+
35+
<insert id="insertTooManyValuesInSelectKey" parameterType="map">
36+
insert into table2 (name) values (#{name})
37+
<selectKey resultType="java.lang.Integer" keyProperty="id">
38+
select id from table2
39+
</selectKey>
40+
</insert>
3441

3542
</mapper>

0 commit comments

Comments
 (0)