Skip to content

Commit 4d777b9

Browse files
authored
Support to include/exclude properties in the Criteria INSERT/UPDATE statements (#789)
* Support to include/exclude properties in the Criteria INSERT/UPDATE statements * Update documentation
1 parent 19ab9a2 commit 4d777b9

File tree

7 files changed

+183
-4
lines changed

7 files changed

+183
-4
lines changed

docs/criteria-api.rst

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,6 +1193,8 @@ We support the following settings:
11931193
* sqlLogType
11941194
* batchSize
11951195
* excludeNull
1196+
* include
1197+
* exclude
11961198

11971199
They are all optional.
11981200

@@ -1221,6 +1223,16 @@ You can apply them as follows:
12211223
})
12221224
.execute();
12231225
1226+
.. code-block:: java
1227+
1228+
Department_ d = new Department_();
1229+
1230+
Department department = ...;
1231+
1232+
Result<Department> result = entityql.insert(d, department, settings ->
1233+
settings.exclude(d.departmentName, d.location)
1234+
).execute();
1235+
12241236
Insert statement (Entityql)
12251237
----------------------------
12261238

@@ -1330,6 +1342,8 @@ We support the following settings:
13301342
* sqlLogType
13311343
* suppressOptimisticLockException
13321344
* excludeNull
1345+
* include
1346+
* exclude
13331347

13341348
They are all optional.
13351349

@@ -1352,6 +1366,16 @@ You can apply them as follows:
13521366
c.value(e.employeeName, "aaa");
13531367
}).execute();
13541368
1369+
.. code-block:: java
1370+
1371+
Employee_ e = new Employee_();
1372+
1373+
Employee employee = ...;
1374+
1375+
Result<Employee> result = entityql.update(e, employee, settings ->
1376+
settings.exclude(e.hiredate, e.salary)
1377+
).execute();
1378+
13551379
.. note::
13561380

13571381
If you want to build a update statement without a WHERE clause,

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/InsertSettings.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package org.seasar.doma.jdbc.criteria.context;
22

33
import java.sql.PreparedStatement;
4+
import java.util.ArrayList;
5+
import java.util.Collections;
6+
import java.util.List;
7+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
48

59
/** Represents the settings for an INSERT criteria query. */
610
public class InsertSettings extends Settings {
711
private int batchSize = 0;
812
private boolean excludeNull;
13+
private final List<PropertyMetamodel<?>> includedProperties = new ArrayList<>();
14+
private final List<PropertyMetamodel<?>> excludedProperties = new ArrayList<>();
915

1016
/**
1117
* Returns the batch size.
@@ -49,4 +55,40 @@ public boolean getExcludeNull() {
4955
public void setExcludeNull(boolean excludeNull) {
5056
this.excludeNull = excludeNull;
5157
}
58+
59+
/**
60+
* Returns the included properties.
61+
*
62+
* @return the included properties
63+
*/
64+
public List<PropertyMetamodel<?>> include() {
65+
return includedProperties;
66+
}
67+
68+
/**
69+
* Sets the included properties.
70+
*
71+
* @param propertyMetamodels the included properties
72+
*/
73+
public void include(PropertyMetamodel<?>... propertyMetamodels) {
74+
Collections.addAll(includedProperties, propertyMetamodels);
75+
}
76+
77+
/**
78+
* Returns the excluded properties.
79+
*
80+
* @return the excluded properties
81+
*/
82+
public List<PropertyMetamodel<?>> exclude() {
83+
return excludedProperties;
84+
}
85+
86+
/**
87+
* Sets the excluded properties.
88+
*
89+
* @param propertyMetamodels the excluded properties
90+
*/
91+
public void exclude(PropertyMetamodel<?>... propertyMetamodels) {
92+
Collections.addAll(excludedProperties, propertyMetamodels);
93+
}
5294
}

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateSettings.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.seasar.doma.jdbc.criteria.context;
22

33
import java.sql.PreparedStatement;
4+
import java.util.ArrayList;
5+
import java.util.Collections;
6+
import java.util.List;
7+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
48

59
/** Represents the settings for an UPDATE criteria query. */
610
public class UpdateSettings extends Settings {
@@ -9,6 +13,8 @@ public class UpdateSettings extends Settings {
913
private boolean ignoreVersion;
1014
private boolean suppressOptimisticLockException;
1115
private boolean excludeNull;
16+
private final List<PropertyMetamodel<?>> includedProperties = new ArrayList<>();
17+
private final List<PropertyMetamodel<?>> excludedProperties = new ArrayList<>();
1218

1319
/**
1420
* Returns the batch size.
@@ -115,4 +121,40 @@ public boolean getExcludeNull() {
115121
public void setExcludeNull(boolean excludeNull) {
116122
this.excludeNull = excludeNull;
117123
}
124+
125+
/**
126+
* Returns the included properties.
127+
*
128+
* @return the included properties
129+
*/
130+
public List<PropertyMetamodel<?>> include() {
131+
return includedProperties;
132+
}
133+
134+
/**
135+
* Sets the included properties.
136+
*
137+
* @param propertyMetamodels the included properties
138+
*/
139+
public void include(PropertyMetamodel<?>... propertyMetamodels) {
140+
Collections.addAll(includedProperties, propertyMetamodels);
141+
}
142+
143+
/**
144+
* Returns the excluded properties.
145+
*
146+
* @return the excluded properties
147+
*/
148+
public List<PropertyMetamodel<?>> exclude() {
149+
return excludedProperties;
150+
}
151+
152+
/**
153+
* Sets the excluded properties.
154+
*
155+
* @param propertyMetamodels the excluded properties
156+
*/
157+
public void exclude(PropertyMetamodel<?>... propertyMetamodels) {
158+
Collections.addAll(excludedProperties, propertyMetamodels);
159+
}
118160
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.seasar.doma.jdbc.command.InsertCommand;
88
import org.seasar.doma.jdbc.criteria.context.InsertSettings;
99
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
10+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
1011
import org.seasar.doma.jdbc.entity.EntityType;
1112
import org.seasar.doma.jdbc.query.AutoInsertQuery;
1213
import org.seasar.doma.jdbc.query.Query;
@@ -54,8 +55,10 @@ protected Command<Result<ENTITY>> createCommand() {
5455
query.setQueryTimeout(settings.getQueryTimeout());
5556
query.setSqlLogType(settings.getSqlLogType());
5657
query.setNullExcluded(settings.getExcludeNull());
57-
query.setIncludedPropertyNames();
58-
query.setExcludedPropertyNames();
58+
query.setIncludedPropertyNames(
59+
settings.include().stream().map(PropertyMetamodel::getName).toArray(String[]::new));
60+
query.setExcludedPropertyNames(
61+
settings.exclude().stream().map(PropertyMetamodel::getName).toArray(String[]::new));
5962
query.setMessage(settings.getComment());
6063
query.prepare();
6164
InsertCommand command =

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.seasar.doma.jdbc.command.UpdateCommand;
99
import org.seasar.doma.jdbc.criteria.context.UpdateSettings;
1010
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
11+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
1112
import org.seasar.doma.jdbc.entity.EntityType;
1213
import org.seasar.doma.jdbc.query.AutoUpdateQuery;
1314
import org.seasar.doma.jdbc.query.Query;
@@ -60,8 +61,10 @@ protected Command<Result<ENTITY>> createCommand() {
6061
query.setSqlLogType(settings.getSqlLogType());
6162
query.setNullExcluded(settings.getExcludeNull());
6263
query.setVersionIgnored(settings.getIgnoreVersion());
63-
query.setIncludedPropertyNames();
64-
query.setExcludedPropertyNames();
64+
query.setIncludedPropertyNames(
65+
settings.include().stream().map(PropertyMetamodel::getName).toArray(String[]::new));
66+
query.setExcludedPropertyNames(
67+
settings.exclude().stream().map(PropertyMetamodel::getName).toArray(String[]::new));
6568
query.setUnchangedPropertyIncluded(false);
6669
query.setOptimisticLockExceptionSuppressed(settings.getSuppressOptimisticLockException());
6770
query.setMessage(settings.getComment());

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlInsertTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,35 @@ void excludeNull() {
4646
assertEquals(
4747
"insert into EMP (ID, SALARY, VERSION) values (1, 1000, 1)", sql.getFormattedSql());
4848
}
49+
50+
@Test
51+
void include() {
52+
Emp emp = new Emp();
53+
emp.setId(1);
54+
emp.setName("aaa");
55+
emp.setSalary(new BigDecimal("1000"));
56+
emp.setVersion(1);
57+
58+
Emp_ e = new Emp_();
59+
Buildable<?> stmt = entityql.insert(e, emp, settings -> settings.include(e.salary));
60+
61+
Sql<?> sql = stmt.asSql();
62+
assertEquals(
63+
"insert into EMP (ID, SALARY, VERSION) values (1, 1000, 1)", sql.getFormattedSql());
64+
}
65+
66+
@Test
67+
void exclude() {
68+
Emp emp = new Emp();
69+
emp.setId(1);
70+
emp.setName("aaa");
71+
emp.setSalary(new BigDecimal("1000"));
72+
emp.setVersion(1);
73+
74+
Emp_ e = new Emp_();
75+
Buildable<?> stmt = entityql.insert(e, emp, settings -> settings.exclude(e.salary));
76+
77+
Sql<?> sql = stmt.asSql();
78+
assertEquals("insert into EMP (ID, NAME, VERSION) values (1, 'aaa', 1)", sql.getFormattedSql());
79+
}
4980
}

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlUpdateTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,40 @@ void test() {
3131
sql.getFormattedSql());
3232
}
3333

34+
@Test
35+
void include() {
36+
Emp emp = new Emp();
37+
emp.setId(1);
38+
emp.setName("aaa");
39+
emp.setSalary(new BigDecimal("1000"));
40+
emp.setVersion(1);
41+
42+
Emp_ e = new Emp_();
43+
Buildable<?> stmt = entityql.update(e, emp, settings -> settings.include(e.salary));
44+
45+
Sql<?> sql = stmt.asSql();
46+
assertEquals(
47+
"update EMP set SALARY = 1000, VERSION = 1 + 1 where ID = 1 and VERSION = 1",
48+
sql.getFormattedSql());
49+
}
50+
51+
@Test
52+
void exclude() {
53+
Emp emp = new Emp();
54+
emp.setId(1);
55+
emp.setName("aaa");
56+
emp.setSalary(new BigDecimal("1000"));
57+
emp.setVersion(1);
58+
59+
Emp_ e = new Emp_();
60+
Buildable<?> stmt = entityql.update(e, emp, settings -> settings.exclude(e.salary));
61+
62+
Sql<?> sql = stmt.asSql();
63+
assertEquals(
64+
"update EMP set NAME = 'aaa', VERSION = 1 + 1 where ID = 1 and VERSION = 1",
65+
sql.getFormattedSql());
66+
}
67+
3468
@Test
3569
void ignoreVersion() {
3670
Emp emp = new Emp();

0 commit comments

Comments
 (0)