Skip to content

Commit c7f8518

Browse files
committed
Implements Entityql.
1 parent 7f00cdb commit c7f8518

File tree

2 files changed

+125
-0
lines changed

2 files changed

+125
-0
lines changed

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlMultiInsertStatement.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
1414
import org.seasar.doma.jdbc.entity.EntityType;
1515
import org.seasar.doma.jdbc.query.AutoMultiInsertQuery;
16+
import org.seasar.doma.jdbc.query.DuplicateKeyType;
1617
import org.seasar.doma.jdbc.query.Query;
1718

1819
public class EntityqlMultiInsertStatement<ENTITY>
@@ -23,6 +24,7 @@ public class EntityqlMultiInsertStatement<ENTITY>
2324
private final EntityMetamodel<ENTITY> entityMetamodel;
2425
private final List<ENTITY> entities;
2526
private final InsertSettings settings;
27+
private DuplicateKeyType duplicateKeyType = DuplicateKeyType.EXCEPTION;
2628

2729
public EntityqlMultiInsertStatement(
2830
Config config,
@@ -35,6 +37,26 @@ public EntityqlMultiInsertStatement(
3537
this.settings = Objects.requireNonNull(settings);
3638
}
3739

40+
/**
41+
* Create statement that inserts or updates
42+
*
43+
* @return statement
44+
*/
45+
public EntityqlMultiInsertStatement<ENTITY> onDuplicateKeyUpdate() {
46+
this.duplicateKeyType = DuplicateKeyType.UPDATE;
47+
return this;
48+
}
49+
50+
/**
51+
* Create statement that inserts or ignore
52+
*
53+
* @return statement
54+
*/
55+
public EntityqlMultiInsertStatement<ENTITY> onDuplicateKeyIgnore() {
56+
this.duplicateKeyType = DuplicateKeyType.IGNORE;
57+
return this;
58+
}
59+
3860
/**
3961
* {@inheritDoc}
4062
*
@@ -64,6 +86,7 @@ protected Command<MultiResult<ENTITY>> createCommand() {
6486
query.setExcludedPropertyNames(
6587
settings.exclude().stream().map(PropertyMetamodel::getName).toArray(String[]::new));
6688
query.setMessage(settings.getComment());
89+
query.setDuplicateKeyType(this.duplicateKeyType);
6790
query.prepare();
6891
InsertCommand command =
6992
config.getCommandImplementors().createInsertCommand(EXECUTE_METHOD, query);

integration-test-java/src/test/java/org/seasar/doma/it/criteria/EntityqlMultiInsertTest.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import java.util.Arrays;
88
import java.util.Collections;
99
import java.util.List;
10+
import java.util.Map;
11+
import java.util.function.Function;
12+
import java.util.stream.Collectors;
1013
import org.junit.jupiter.api.Test;
1114
import org.junit.jupiter.api.extension.ExtendWith;
1215
import org.seasar.doma.it.Dbms;
@@ -61,6 +64,105 @@ void test() {
6164
assertEquals(2, departments2.size());
6265
}
6366

67+
@Test
68+
@Run(unless = {Dbms.ORACLE, Dbms.SQLSERVER, Dbms.H2})
69+
void testIgnore() {
70+
Department_ d = new Department_();
71+
72+
Department department = new Department();
73+
department.setDepartmentId(99);
74+
department.setDepartmentNo(99);
75+
department.setDepartmentName("aaa");
76+
department.setLocation("bbb");
77+
78+
Department department2 = new Department();
79+
department2.setDepartmentId(100);
80+
department2.setDepartmentNo(100);
81+
department2.setDepartmentName("ccc");
82+
department2.setLocation("ddd");
83+
84+
Department department3 = new Department();
85+
department3.setDepartmentId(101);
86+
department3.setDepartmentNo(101);
87+
department3.setDepartmentName("eee");
88+
department3.setLocation("fff");
89+
90+
entityql.insertMulti(d, Arrays.asList(department, department2)).execute();
91+
92+
department.setDepartmentName("aaa_updated");
93+
department.setLocation("bbb_updated");
94+
95+
List<Department> departments = Arrays.asList(department, department3);
96+
MultiResult<Department> result =
97+
entityql.insertMulti(d, departments).onDuplicateKeyIgnore().execute();
98+
assertEquals(departments, result.getEntities());
99+
assertEquals(1, result.getCount());
100+
101+
List<Integer> ids = departments.stream().map(Department::getDepartmentId).collect(toList());
102+
103+
Map<Integer, Department> departments2 =
104+
entityql
105+
.from(d)
106+
.where(c -> c.in(d.departmentId, ids))
107+
.orderBy(c -> c.asc(d.departmentId))
108+
.stream()
109+
.collect(Collectors.toMap(Department::getDepartmentId, Function.identity()));
110+
assertEquals(2, departments2.size());
111+
assertEquals("aaa", departments2.get(99).getDepartmentName());
112+
}
113+
114+
@Test
115+
@Run(unless = {Dbms.ORACLE, Dbms.SQLSERVER, Dbms.H2})
116+
void testUpdate() {
117+
Department_ d = new Department_();
118+
119+
Department department = new Department();
120+
department.setDepartmentId(99);
121+
department.setDepartmentNo(99);
122+
department.setDepartmentName("aaa");
123+
department.setLocation("bbb");
124+
125+
Department department2 = new Department();
126+
department2.setDepartmentId(100);
127+
department2.setDepartmentNo(100);
128+
department2.setDepartmentName("ccc");
129+
department2.setLocation("ddd");
130+
131+
Department department3 = new Department();
132+
department3.setDepartmentId(101);
133+
department3.setDepartmentNo(101);
134+
department3.setDepartmentName("eee");
135+
department3.setLocation("fff");
136+
137+
entityql.insertMulti(d, Arrays.asList(department, department2)).execute();
138+
139+
department.setDepartmentName("aaa_updated");
140+
department.setLocation("bbb_updated");
141+
142+
List<Department> departments = Arrays.asList(department, department3);
143+
MultiResult<Department> result =
144+
entityql.insertMulti(d, departments).onDuplicateKeyUpdate().execute();
145+
assertEquals(departments, result.getEntities());
146+
if (dialect.getName().equals("mysql") || dialect.getName().equals("mariadb")) {
147+
assertEquals(3, result.getCount());
148+
} else {
149+
assertEquals(2, result.getCount());
150+
}
151+
152+
List<Integer> ids = departments.stream().map(Department::getDepartmentId).collect(toList());
153+
154+
Map<Integer, Department> departments2 =
155+
entityql
156+
.from(d)
157+
.where(c -> c.in(d.departmentId, ids))
158+
.orderBy(c -> c.asc(d.departmentId))
159+
.stream()
160+
.collect(Collectors.toMap(Department::getDepartmentId, Function.identity()));
161+
assertEquals(2, departments2.size());
162+
assertEquals("aaa_updated", departments2.get(99).getDepartmentName());
163+
assertEquals("eee", departments2.get(101).getDepartmentName());
164+
}
165+
64166
@Test
65167
@Run(unless = {Dbms.ORACLE})
66168
void empty() {

0 commit comments

Comments
 (0)