Skip to content

Commit 81ef21a

Browse files
authored
Merge pull request #1146 from momosetkn/feat/doma-kotlin-insertMulti
Support upsert with insertMulti in doma-kotlin
2 parents 9a984c7 + 3628476 commit 81ef21a

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

doma-kotlin/src/main/kotlin/org/seasar/doma/kotlin/jdbc/criteria/statement/KEntityqlMultiInsertStatement.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ class KEntityqlMultiInsertStatement<ENTITY>(
88
private val statement: EntityqlMultiInsertStatement<ENTITY>,
99
) : KStatement<MultiResult<ENTITY>> {
1010

11+
fun onDuplicateKeyUpdate(): KStatement<MultiResult<ENTITY>> {
12+
return KEntityqlMultiUpsertStatement(statement.onDuplicateKeyUpdate())
13+
}
14+
15+
fun onDuplicateKeyIgnore(): KStatement<MultiResult<ENTITY>> {
16+
return KEntityqlMultiUpsertStatement(statement.onDuplicateKeyIgnore())
17+
}
18+
1119
override fun execute(): MultiResult<ENTITY> {
1220
return statement.execute()
1321
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package org.seasar.doma.jdbc.criteria
2+
3+
import org.junit.jupiter.api.Assertions
4+
import org.junit.jupiter.api.Test
5+
import org.seasar.doma.jdbc.criteria.entity.Emp
6+
import org.seasar.doma.jdbc.criteria.entity.Emp_
7+
import org.seasar.doma.jdbc.criteria.mock.MockConfig
8+
import java.math.BigDecimal
9+
10+
internal class KEntityqlInsertMultiTest {
11+
private val config = MockConfig().apply {
12+
dialect = org.seasar.doma.jdbc.dialect.PostgresDialect()
13+
}
14+
15+
private val entityql = org.seasar.doma.kotlin.jdbc.criteria.KEntityql(config)
16+
17+
private val items = listOf(
18+
Emp().apply {
19+
id = 1
20+
name = "aaa"
21+
salary = BigDecimal("1000")
22+
version = 1
23+
},
24+
Emp().apply {
25+
id = 2
26+
name = "eee"
27+
salary = BigDecimal("2000")
28+
version = 2
29+
},
30+
)
31+
32+
@Test
33+
fun insertMultiMultiInto() {
34+
val e = Emp_()
35+
val stmt = entityql.insertMulti(e, items)
36+
val sql = stmt.asSql()
37+
Assertions.assertEquals(
38+
"insert into EMP (ID, NAME, SALARY, VERSION) values (1, 'aaa', 1000, 1), (2, 'eee', 2000, 2)",
39+
sql.formattedSql,
40+
)
41+
}
42+
43+
@Test
44+
fun insertMultiMultiOnDuplicateKeyUpdate() {
45+
val e = Emp_()
46+
val stmt = entityql.insertMulti(e, items).onDuplicateKeyUpdate()
47+
val sql = stmt.asSql()
48+
Assertions.assertEquals(
49+
"insert into EMP as target (ID, NAME, SALARY, VERSION) values (1, 'aaa', 1000, 1), (2, 'eee', 2000, 2) on conflict (ID) do update set NAME = excluded.NAME, SALARY = excluded.SALARY, VERSION = excluded.VERSION",
50+
sql.formattedSql,
51+
)
52+
}
53+
54+
@Test
55+
fun insertMultiOnDuplicateKeyIgnore() {
56+
val e = Emp_()
57+
val stmt = entityql.insertMulti(e, items).onDuplicateKeyIgnore()
58+
val sql = stmt.asSql()
59+
Assertions.assertEquals(
60+
"insert into EMP as target (ID, NAME, SALARY, VERSION) values (1, 'aaa', 1000, 1), (2, 'eee', 2000, 2) on conflict do nothing",
61+
sql.formattedSql,
62+
)
63+
}
64+
}

0 commit comments

Comments
 (0)