Skip to content

Commit a98f711

Browse files
committed
Allow specifying columns to return in the returning clause
1 parent 531273b commit a98f711

File tree

49 files changed

+609
-199
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+609
-199
lines changed

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

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,41 +25,44 @@
2525
import org.seasar.doma.jdbc.command.DeleteReturningCommand;
2626
import org.seasar.doma.jdbc.criteria.context.DeleteSettings;
2727
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
28+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
2829
import org.seasar.doma.jdbc.entity.EntityType;
2930
import org.seasar.doma.jdbc.query.AutoDeleteQuery;
3031
import org.seasar.doma.jdbc.query.Query;
32+
import org.seasar.doma.jdbc.query.ReturningProperties;
3133

3234
public class EntityqlDeleteStatement<ENTITY>
3335
extends AbstractStatement<EntityqlDeleteStatement<ENTITY>, Result<ENTITY>> {
3436

3537
private final EntityMetamodel<ENTITY> entityMetamodel;
3638
private final ENTITY entity;
3739
private final DeleteSettings settings;
38-
private final boolean returning;
40+
private final ReturningProperties returning;
3941

4042
public EntityqlDeleteStatement(
4143
Config config,
4244
EntityMetamodel<ENTITY> entityMetamodel,
4345
ENTITY entity,
4446
DeleteSettings settings) {
45-
this(config, entityMetamodel, entity, settings, false);
47+
this(config, entityMetamodel, entity, settings, ReturningProperties.NONE);
4648
}
4749

4850
private EntityqlDeleteStatement(
4951
Config config,
5052
EntityMetamodel<ENTITY> entityMetamodel,
5153
ENTITY entity,
5254
DeleteSettings settings,
53-
boolean returning) {
55+
ReturningProperties returning) {
5456
super(Objects.requireNonNull(config));
5557
this.entityMetamodel = Objects.requireNonNull(entityMetamodel);
5658
this.entity = Objects.requireNonNull(entity);
5759
this.settings = Objects.requireNonNull(settings);
5860
this.returning = returning;
5961
}
6062

61-
public Statement<Result<ENTITY>> returning() {
62-
return new EntityqlDeleteStatement<>(config, entityMetamodel, entity, settings, true);
63+
public Statement<Result<ENTITY>> returning(PropertyMetamodel<?>... properties) {
64+
var returning = SpecificMetamodels.of(entityMetamodel, properties);
65+
return new EntityqlDeleteStatement<>(config, entityMetamodel, entity, settings, returning);
6366
}
6467

6568
/**
@@ -94,20 +97,16 @@ protected Command<Result<ENTITY>> createCommand() {
9497
query.setMessage(settings.getComment());
9598
query.setReturning(returning);
9699
query.prepare();
97-
if (returning) {
98-
return createReturningCommand(entityType, query);
99-
} else {
100+
if (returning.isNone()) {
100101
return createCommand(query);
102+
} else {
103+
return createReturningCommand(entityType, query);
101104
}
102105
}
103106

104-
private Command<Result<ENTITY>> createReturningCommand(
105-
EntityType<ENTITY> entityType, AutoDeleteQuery<ENTITY> query) {
106-
DeleteReturningCommand<ENTITY> command =
107-
config
108-
.getCommandImplementors()
109-
.createDeleteReturningCommand(
110-
EXECUTE_METHOD, query, new EntitySingleResultHandler<>(entityType), () -> null);
107+
private Command<Result<ENTITY>> createCommand(AutoDeleteQuery<ENTITY> query) {
108+
DeleteCommand command =
109+
config.getCommandImplementors().createDeleteCommand(EXECUTE_METHOD, query);
111110
return new Command<>() {
112111
@Override
113112
public Query getQuery() {
@@ -116,17 +115,20 @@ public Query getQuery() {
116115

117116
@Override
118117
public Result<ENTITY> execute() {
119-
ENTITY entity = command.execute();
120-
int count = entity == null ? 0 : 1;
118+
int count = command.execute();
121119
query.complete();
122-
return new Result<>(count, entity);
120+
return new Result<>(count, query.getEntity());
123121
}
124122
};
125123
}
126124

127-
private Command<Result<ENTITY>> createCommand(AutoDeleteQuery<ENTITY> query) {
128-
DeleteCommand command =
129-
config.getCommandImplementors().createDeleteCommand(EXECUTE_METHOD, query);
125+
private Command<Result<ENTITY>> createReturningCommand(
126+
EntityType<ENTITY> entityType, AutoDeleteQuery<ENTITY> query) {
127+
DeleteReturningCommand<ENTITY> command =
128+
config
129+
.getCommandImplementors()
130+
.createDeleteReturningCommand(
131+
EXECUTE_METHOD, query, new EntitySingleResultHandler<>(entityType), () -> null);
130132
return new Command<>() {
131133
@Override
132134
public Query getQuery() {
@@ -135,9 +137,10 @@ public Query getQuery() {
135137

136138
@Override
137139
public Result<ENTITY> execute() {
138-
int count = command.execute();
140+
ENTITY entity = command.execute();
141+
int count = entity == null ? 0 : 1;
139142
query.complete();
140-
return new Result<>(count, query.getEntity());
143+
return new Result<>(count, entity);
141144
}
142145
};
143146
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@ public EntityqlInsertTerminal<ENTITY> keys(PropertyMetamodel<?>... keys) {
6060
config, entityMetamodel, entity, settings, duplicateKeyType, Arrays.stream(keys).toList());
6161
}
6262

63-
public Statement<Result<ENTITY>> returning() {
63+
public Statement<Result<ENTITY>> returning(PropertyMetamodel<?>... properties) {
64+
var returning = SpecificMetamodels.of(entityMetamodel, properties);
6465
return new EntityqlInsertTerminal<>(
65-
config, entityMetamodel, entity, settings, duplicateKeyType, List.of(), true);
66+
config, entityMetamodel, entity, settings, duplicateKeyType, List.of(), returning);
6667
}
6768

6869
/**

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.seasar.doma.jdbc.command.Command;
2323
import org.seasar.doma.jdbc.criteria.context.InsertSettings;
2424
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
25+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
2526
import org.seasar.doma.jdbc.query.DuplicateKeyType;
2627

2728
public class EntityqlInsertStatement<ENTITY>
@@ -65,10 +66,10 @@ public EntityqlInsertIntermediate<ENTITY> onDuplicateKeyIgnore() {
6566
config, entityMetamodel, entity, settings, duplicateKeyType);
6667
}
6768

68-
public Statement<Result<ENTITY>> returning() {
69+
public Statement<Result<ENTITY>> returning(PropertyMetamodel<?>... properties) {
6970
return new EntityqlInsertIntermediate<>(
7071
config, entityMetamodel, entity, settings, duplicateKeyType)
71-
.returning();
72+
.returning(properties);
7273
}
7374

7475
/**

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

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.seasar.doma.jdbc.query.AutoInsertQuery;
3131
import org.seasar.doma.jdbc.query.DuplicateKeyType;
3232
import org.seasar.doma.jdbc.query.Query;
33+
import org.seasar.doma.jdbc.query.ReturningProperties;
3334

3435
public class EntityqlInsertTerminal<ENTITY>
3536
extends AbstractStatement<EntityqlInsertTerminal<ENTITY>, Result<ENTITY>> {
@@ -39,7 +40,7 @@ public class EntityqlInsertTerminal<ENTITY>
3940
private final InsertSettings settings;
4041
private final DuplicateKeyType duplicateKeyType;
4142
private final List<PropertyMetamodel<?>> keys;
42-
private final boolean returning;
43+
private final ReturningProperties returning;
4344

4445
public EntityqlInsertTerminal(
4546
Config config,
@@ -48,7 +49,14 @@ public EntityqlInsertTerminal(
4849
InsertSettings settings,
4950
DuplicateKeyType duplicateKeyType,
5051
List<PropertyMetamodel<?>> keys) {
51-
this(config, entityMetamodel, entity, settings, duplicateKeyType, keys, false);
52+
this(
53+
config,
54+
entityMetamodel,
55+
entity,
56+
settings,
57+
duplicateKeyType,
58+
keys,
59+
ReturningProperties.NONE);
5260
}
5361

5462
public EntityqlInsertTerminal(
@@ -58,19 +66,20 @@ public EntityqlInsertTerminal(
5866
InsertSettings settings,
5967
DuplicateKeyType duplicateKeyType,
6068
List<PropertyMetamodel<?>> keys,
61-
boolean returning) {
69+
ReturningProperties returning) {
6270
super(Objects.requireNonNull(config));
6371
this.entityMetamodel = Objects.requireNonNull(entityMetamodel);
6472
this.entity = Objects.requireNonNull(entity);
6573
this.settings = Objects.requireNonNull(settings);
6674
this.duplicateKeyType = Objects.requireNonNull(duplicateKeyType);
6775
this.keys = Objects.requireNonNull(keys);
68-
this.returning = returning;
76+
this.returning = Objects.requireNonNull(returning);
6977
}
7078

71-
public Statement<Result<ENTITY>> returning() {
79+
public Statement<Result<ENTITY>> returning(PropertyMetamodel<?>... properties) {
80+
var returning = SpecificMetamodels.of(entityMetamodel, properties);
7281
return new EntityqlInsertTerminal<>(
73-
config, entityMetamodel, entity, settings, duplicateKeyType, keys, true);
82+
config, entityMetamodel, entity, settings, duplicateKeyType, keys, returning);
7483
}
7584

7685
/**
@@ -109,20 +118,16 @@ protected Command<Result<ENTITY>> createCommand() {
109118
query.setReturning(returning);
110119
query.prepare();
111120

112-
if (returning) {
113-
return createReturningCommand(entityType, query);
114-
} else {
121+
if (returning.isNone()) {
115122
return createCommand(query);
123+
} else {
124+
return createReturningCommand(entityType, query);
116125
}
117126
}
118127

119-
private Command<Result<ENTITY>> createReturningCommand(
120-
EntityType<ENTITY> entityType, AutoInsertQuery<ENTITY> query) {
121-
InsertReturningCommand<ENTITY> command =
122-
config
123-
.getCommandImplementors()
124-
.createInsertReturningCommand(
125-
EXECUTE_METHOD, query, new EntitySingleResultHandler<>(entityType), () -> null);
128+
private Command<Result<ENTITY>> createCommand(AutoInsertQuery<ENTITY> query) {
129+
InsertCommand command =
130+
config.getCommandImplementors().createInsertCommand(EXECUTE_METHOD, query);
126131
return new Command<>() {
127132
@Override
128133
public Query getQuery() {
@@ -131,17 +136,20 @@ public Query getQuery() {
131136

132137
@Override
133138
public Result<ENTITY> execute() {
134-
ENTITY entity = command.execute();
135-
int count = entity == null ? 0 : 1;
139+
int count = command.execute();
136140
query.complete();
137-
return new Result<>(count, entity);
141+
return new Result<>(count, query.getEntity());
138142
}
139143
};
140144
}
141145

142-
private Command<Result<ENTITY>> createCommand(AutoInsertQuery<ENTITY> query) {
143-
InsertCommand command =
144-
config.getCommandImplementors().createInsertCommand(EXECUTE_METHOD, query);
146+
private Command<Result<ENTITY>> createReturningCommand(
147+
EntityType<ENTITY> entityType, AutoInsertQuery<ENTITY> query) {
148+
InsertReturningCommand<ENTITY> command =
149+
config
150+
.getCommandImplementors()
151+
.createInsertReturningCommand(
152+
EXECUTE_METHOD, query, new EntitySingleResultHandler<>(entityType), () -> null);
145153
return new Command<>() {
146154
@Override
147155
public Query getQuery() {
@@ -150,9 +158,10 @@ public Query getQuery() {
150158

151159
@Override
152160
public Result<ENTITY> execute() {
153-
int count = command.execute();
161+
ENTITY entity = command.execute();
162+
int count = entity == null ? 0 : 1;
154163
query.complete();
155-
return new Result<>(count, query.getEntity());
164+
return new Result<>(count, entity);
156165
}
157166
};
158167
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ public EntityqlMultiInsertTerminal<ENTITY> keys(PropertyMetamodel<?>... keys) {
6868
Arrays.stream(keys).toList());
6969
}
7070

71-
public Statement<MultiResult<ENTITY>> returning() {
71+
public Statement<MultiResult<ENTITY>> returning(PropertyMetamodel<?>... properties) {
72+
var returning = SpecificMetamodels.of(entityMetamodel, properties);
7273
return new EntityqlMultiInsertTerminal<>(
73-
config, entityMetamodel, entities, settings, duplicateKeyType, List.of(), true);
74+
config, entityMetamodel, entities, settings, duplicateKeyType, List.of(), returning);
7475
}
7576

7677
/**

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.seasar.doma.jdbc.command.Command;
2626
import org.seasar.doma.jdbc.criteria.context.InsertSettings;
2727
import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel;
28+
import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel;
2829
import org.seasar.doma.jdbc.query.DuplicateKeyType;
2930

3031
public class EntityqlMultiInsertStatement<ENTITY>
@@ -70,10 +71,10 @@ public EntityqlMultiInsertIntermediate<ENTITY> onDuplicateKeyIgnore() {
7071
config, entityMetamodel, entities, settings, duplicateKeyType);
7172
}
7273

73-
public Statement<MultiResult<ENTITY>> returning() {
74+
public Statement<MultiResult<ENTITY>> returning(PropertyMetamodel<?>... properties) {
7475
return new EntityqlMultiInsertIntermediate<>(
7576
config, entityMetamodel, entities, settings, duplicateKeyType)
76-
.returning();
77+
.returning(properties);
7778
}
7879

7980
/**

0 commit comments

Comments
 (0)