Skip to content

Commit 76ae7c4

Browse files
committed
Support reuse of where clauses in all applicable DSLs
1 parent 53ab8d2 commit 76ae7c4

File tree

11 files changed

+358
-39
lines changed

11 files changed

+358
-39
lines changed

src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,12 @@ static WhereDSL where() {
162162
}
163163

164164
static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition) {
165-
return WhereDSL.where(column, condition);
165+
return WhereDSL.where().where(column, condition);
166166
}
167167

168168
static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition,
169169
SqlCriterion<?>... subCriteria) {
170-
return WhereDSL.where(column, condition, subCriteria);
170+
return WhereDSL.where().where(column, condition, subCriteria);
171171
}
172172

173173
// where condition connectors

src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Objects;
1919
import java.util.function.Function;
2020
import java.util.function.ToIntFunction;
21+
import java.util.function.UnaryOperator;
2122

2223
import org.mybatis.dynamic.sql.BindableColumn;
2324
import org.mybatis.dynamic.sql.SqlCriterion;
@@ -27,6 +28,7 @@
2728
import org.mybatis.dynamic.sql.util.Buildable;
2829
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
2930
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
31+
import org.mybatis.dynamic.sql.where.WhereModel;
3032

3133
public class DeleteDSL<R> implements Buildable<R> {
3234

@@ -45,10 +47,15 @@ public DeleteWhereBuilder where() {
4547

4648
public <T> DeleteWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
4749
SqlCriterion<?>...subCriteria) {
48-
whereBuilder.and(column, condition, subCriteria);
50+
whereBuilder.where(column, condition, subCriteria);
4951
return whereBuilder;
5052
}
5153

54+
@SuppressWarnings("unchecked")
55+
public DeleteWhereBuilder applyWhere(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
56+
return (DeleteWhereBuilder) whereApplyer.apply(whereBuilder);
57+
}
58+
5259
/**
5360
* WARNING! Calling this method could result in an delete statement that deletes
5461
* all rows in a table.
@@ -102,5 +109,10 @@ public R build() {
102109
protected DeleteWhereBuilder getThis() {
103110
return this;
104111
}
112+
113+
@Override
114+
protected WhereModel buildWhereModel() {
115+
return super.internalBuild();
116+
}
105117
}
106118
}

src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Objects;
1919
import java.util.function.Function;
20+
import java.util.function.UnaryOperator;
2021

2122
import org.mybatis.dynamic.sql.BindableColumn;
2223
import org.mybatis.dynamic.sql.SqlBuilder;
@@ -25,6 +26,7 @@
2526
import org.mybatis.dynamic.sql.VisitableCondition;
2627
import org.mybatis.dynamic.sql.util.Buildable;
2728
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
29+
import org.mybatis.dynamic.sql.where.WhereModel;
2830

2931
/**
3032
* DSL for building count queries. Count queries are specializations of select queries. They have joins and where
@@ -51,10 +53,15 @@ public CountWhereBuilder where() {
5153

5254
public <T> CountWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
5355
SqlCriterion<?>...subCriteria) {
54-
whereBuilder.and(column, condition, subCriteria);
56+
whereBuilder.where(column, condition, subCriteria);
5557
return whereBuilder;
5658
}
5759

60+
@SuppressWarnings("unchecked")
61+
public CountWhereBuilder applyWhere(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
62+
return (CountWhereBuilder) whereApplyer.apply(whereBuilder);
63+
}
64+
5865
@Override
5966
public R build() {
6067
return adapterFunction.apply(buildModel());
@@ -100,5 +107,10 @@ public R build() {
100107
protected CountWhereBuilder getThis() {
101108
return this;
102109
}
110+
111+
@Override
112+
protected WhereModel buildWhereModel() {
113+
return super.internalBuild();
114+
}
103115
}
104116
}

src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Collection;
2121
import java.util.List;
2222
import java.util.Objects;
23+
import java.util.function.UnaryOperator;
2324

2425
import org.mybatis.dynamic.sql.BasicColumn;
2526
import org.mybatis.dynamic.sql.BindableColumn;
@@ -33,6 +34,7 @@
3334
import org.mybatis.dynamic.sql.select.join.JoinType;
3435
import org.mybatis.dynamic.sql.util.Buildable;
3536
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
37+
import org.mybatis.dynamic.sql.where.WhereModel;
3638

3739
public class QueryExpressionDSL<R> extends AbstractQueryExpressionDSL<QueryExpressionDSL<R>, R>
3840
implements Buildable<R> {
@@ -63,10 +65,15 @@ public QueryExpressionWhereBuilder where() {
6365

6466
public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
6567
SqlCriterion<?>...subCriteria) {
66-
whereBuilder.and(column, condition, subCriteria);
68+
whereBuilder.where(column, condition, subCriteria);
6769
return whereBuilder;
6870
}
6971

72+
@SuppressWarnings("unchecked")
73+
public QueryExpressionWhereBuilder applyWhere(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
74+
return (QueryExpressionWhereBuilder) whereApplyer.apply(whereBuilder);
75+
}
76+
7077
@Override
7178
public R build() {
7279
return selectDSL.build();
@@ -253,6 +260,11 @@ public R build() {
253260
protected QueryExpressionWhereBuilder getThis() {
254261
return this;
255262
}
263+
264+
@Override
265+
protected WhereModel buildWhereModel() {
266+
return super.internalBuild();
267+
}
256268
}
257269

258270
public class JoinSpecificationStarter {
@@ -322,6 +334,10 @@ public <T> QueryExpressionWhereBuilder where(BindableColumn<T> column, Visitable
322334
return QueryExpressionDSL.this.where(column, condition, subCriteria);
323335
}
324336

337+
public QueryExpressionWhereBuilder applyWhere(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
338+
return QueryExpressionDSL.this.applyWhere(whereApplyer);
339+
}
340+
325341
public JoinSpecificationFinisher and(BasicColumn joinColumn, JoinCondition joinCondition) {
326342
JoinCriterion joinCriterion = new JoinCriterion.Builder()
327343
.withConnector("and") //$NON-NLS-1$

src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.function.Function;
2222
import java.util.function.Supplier;
2323
import java.util.function.ToIntFunction;
24+
import java.util.function.UnaryOperator;
2425

2526
import org.mybatis.dynamic.sql.BasicColumn;
2627
import org.mybatis.dynamic.sql.BindableColumn;
@@ -40,6 +41,7 @@
4041
import org.mybatis.dynamic.sql.util.ValueMapping;
4142
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
4243
import org.mybatis.dynamic.sql.where.AbstractWhereDSL;
44+
import org.mybatis.dynamic.sql.where.WhereModel;
4345

4446
public class UpdateDSL<R> implements Buildable<R> {
4547

@@ -63,10 +65,15 @@ public UpdateWhereBuilder where() {
6365

6466
public <T> UpdateWhereBuilder where(BindableColumn<T> column, VisitableCondition<T> condition,
6567
SqlCriterion<?>...subCriteria) {
66-
whereBuilder.and(column, condition, subCriteria);
68+
whereBuilder.where(column, condition, subCriteria);
6769
return whereBuilder;
6870
}
6971

72+
@SuppressWarnings("unchecked")
73+
public UpdateWhereBuilder applyWhere(UnaryOperator<AbstractWhereDSL<?>> whereApplyer) {
74+
return (UpdateWhereBuilder) whereApplyer.apply(whereBuilder);
75+
}
76+
7077
/**
7178
* WARNING! Calling this method could result in an update statement that updates
7279
* all rows in a table.
@@ -175,5 +182,10 @@ public R build() {
175182
protected UpdateWhereBuilder getThis() {
176183
return this;
177184
}
185+
186+
@Override
187+
protected WhereModel buildWhereModel() {
188+
return super.internalBuild();
189+
}
178190
}
179191
}

src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,19 @@ protected <S> AbstractWhereDSL() {
3030
super();
3131
}
3232

33-
protected <S> AbstractWhereDSL(BindableColumn<S> column, VisitableCondition<S> condition) {
34-
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
35-
.withCondition(condition)
36-
.build();
37-
criteria.add(criterion);
33+
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition) {
34+
addCriterion(column, condition);
35+
return getThis();
3836
}
3937

40-
protected <S> AbstractWhereDSL(BindableColumn<S> column, VisitableCondition<S> condition,
41-
SqlCriterion<?>...subCriteria) {
42-
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
43-
.withCondition(condition)
44-
.withSubCriteria(Arrays.asList(subCriteria))
45-
.build();
46-
criteria.add(criterion);
38+
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition, SqlCriterion<?>...subCriteria) {
39+
addCriterion(column, condition, Arrays.asList(subCriteria));
40+
return getThis();
41+
}
42+
43+
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition, List<SqlCriterion<?>> subCriteria) {
44+
addCriterion(column, condition, subCriteria);
45+
return getThis();
4746
}
4847

4948
public <S> T and(BindableColumn<S> column, VisitableCondition<S> condition) {
@@ -76,6 +75,13 @@ public <S> T or(BindableColumn<S> column, VisitableCondition<S> condition, List<
7675
return getThis();
7776
}
7877

78+
private <S> void addCriterion(BindableColumn<S> column, VisitableCondition<S> condition) {
79+
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
80+
.withCondition(condition)
81+
.build();
82+
criteria.add(criterion);
83+
}
84+
7985
private <S> void addCriterion(String connector, BindableColumn<S> column, VisitableCondition<S> condition) {
8086
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
8187
.withConnector(connector)
@@ -84,6 +90,15 @@ private <S> void addCriterion(String connector, BindableColumn<S> column, Visita
8490
criteria.add(criterion);
8591
}
8692

93+
private <S> void addCriterion(BindableColumn<S> column, VisitableCondition<S> condition,
94+
List<SqlCriterion<?>> subCriteria) {
95+
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
96+
.withCondition(condition)
97+
.withSubCriteria(subCriteria)
98+
.build();
99+
criteria.add(criterion);
100+
}
101+
87102
private <S> void addCriterion(String connector, BindableColumn<S> column, VisitableCondition<S> condition,
88103
List<SqlCriterion<?>> subCriteria) {
89104
SqlCriterion<S> criterion = SqlCriterion.withColumn(column)
@@ -94,9 +109,11 @@ private <S> void addCriterion(String connector, BindableColumn<S> column, Visita
94109
criteria.add(criterion);
95110
}
96111

97-
public WhereModel buildWhereModel() {
112+
protected WhereModel internalBuild() {
98113
return WhereModel.of(criteria);
99114
}
100115

116+
protected abstract WhereModel buildWhereModel();
117+
101118
protected abstract T getThis();
102119
}

src/main/java/org/mybatis/dynamic/sql/where/WhereDSL.java

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,12 @@
1515
*/
1616
package org.mybatis.dynamic.sql.where;
1717

18-
import org.mybatis.dynamic.sql.BindableColumn;
19-
import org.mybatis.dynamic.sql.SqlCriterion;
20-
import org.mybatis.dynamic.sql.VisitableCondition;
21-
2218
public class WhereDSL extends AbstractWhereDSL<WhereDSL> {
2319

2420
private WhereDSL() {
2521
super();
2622
}
2723

28-
private <T> WhereDSL(BindableColumn<T> column, VisitableCondition<T> condition) {
29-
super(column, condition);
30-
}
31-
32-
private <T> WhereDSL(BindableColumn<T> column, VisitableCondition<T> condition, SqlCriterion<?>... subCriteria) {
33-
super(column, condition, subCriteria);
34-
}
35-
3624
@Override
3725
protected WhereDSL getThis() {
3826
return this;
@@ -42,16 +30,12 @@ public static WhereDSL where() {
4230
return new WhereDSL();
4331
}
4432

45-
public static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition) {
46-
return new WhereDSL(column, condition);
47-
}
48-
49-
public static <T> WhereDSL where(BindableColumn<T> column, VisitableCondition<T> condition,
50-
SqlCriterion<?>... subCriteria) {
51-
return new WhereDSL(column, condition, subCriteria);
33+
@Override
34+
protected WhereModel buildWhereModel() {
35+
return super.internalBuild();
5236
}
5337

5438
public WhereModel build() {
55-
return super.buildWhereModel();
39+
return buildWhereModel();
5640
}
5741
}

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/AbstractWhereDSLExtensions.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ import org.mybatis.dynamic.sql.BindableColumn
1919
import org.mybatis.dynamic.sql.VisitableCondition
2020
import org.mybatis.dynamic.sql.where.AbstractWhereDSL
2121

22+
fun <T, M : AbstractWhereDSL<M>> AbstractWhereDSL<M>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver): M {
23+
val collector = CriteriaCollector()
24+
collect(collector)
25+
return where(column, condition, collector.criteria)
26+
}
27+
2228
fun <T, M : AbstractWhereDSL<M>> AbstractWhereDSL<M>.and(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver): M {
2329
val collector = CriteriaCollector()
2430
collect(collector)

src/test/java/examples/joins/JoinMapperTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,37 @@ public void testMultipleTableJoinWithWhereClause() {
252252
}
253253
}
254254

255+
@Test
256+
public void testMultipleTableJoinWithApplyWhere() {
257+
try (SqlSession session = sqlSessionFactory.openSession()) {
258+
JoinMapper mapper = session.getMapper(JoinMapper.class);
259+
260+
SelectStatementProvider selectStatement = select(orderMaster.orderId, orderDate, orderLine.lineNumber, itemMaster.description, orderLine.quantity)
261+
.from(orderMaster, "om")
262+
.join(orderLine, "ol").on(orderMaster.orderId, equalTo(orderLine.orderId))
263+
.join(itemMaster, "im").on(orderLine.itemId, equalTo(itemMaster.itemId))
264+
.applyWhere(d -> d.where(orderMaster.orderId, isEqualTo(2)))
265+
.build()
266+
.render(RenderingStrategies.MYBATIS3);
267+
268+
String expectedStatment = "select om.order_id, om.order_date, ol.line_number, im.description, ol.quantity"
269+
+ " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id join ItemMaster im on ol.item_id = im.item_id"
270+
+ " where om.order_id = #{parameters.p1,jdbcType=INTEGER}";
271+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expectedStatment);
272+
273+
List<OrderMaster> rows = mapper.selectMany(selectStatement);
274+
275+
assertThat(rows.size()).isEqualTo(1);
276+
OrderMaster orderMaster = rows.get(0);
277+
assertThat(orderMaster.getId()).isEqualTo(2);
278+
assertThat(orderMaster.getDetails().size()).isEqualTo(2);
279+
OrderDetail orderDetail = orderMaster.getDetails().get(0);
280+
assertThat(orderDetail.getLineNumber()).isEqualTo(1);
281+
orderDetail = orderMaster.getDetails().get(1);
282+
assertThat(orderDetail.getLineNumber()).isEqualTo(2);
283+
}
284+
}
285+
255286
@Test
256287
public void testMultipleTableJoinWithComplexWhereClause() {
257288
try (SqlSession session = sqlSessionFactory.openSession()) {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy