Skip to content

Commit 633079b

Browse files
authored
Merge c46f5f5 into 675b37e
2 parents 675b37e + c46f5f5 commit 633079b

File tree

19 files changed

+536
-120
lines changed

19 files changed

+536
-120
lines changed

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,34 @@
22

33
This log will detail notable changes to MyBatis Dynamic SQL. Full details are available on the GitHub milestone pages.
44

5+
## Release 1.5.1 - Unreleased
6+
7+
This is a minor release with a few small enhancements.
8+
9+
GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/milestone/13](https://github.com/mybatis/mybatis-dynamic-sql/milestone/13)
10+
11+
### Parameter Values in Joins
12+
13+
We've added the ability to specify typed values in equi-joins. This allows you to avoid the use of constants, and it is
14+
type safe. For example:
15+
16+
```java
17+
SelectStatementProvider selectStatement = select(orderLine.orderId, orderLine.quantity, itemMaster.itemId, itemMaster.description)
18+
.from(itemMaster, "im")
19+
.join(orderLine, "ol").on(orderLine.itemId, equalTo(itemMaster.itemId))
20+
.and(orderLine.orderId, equalTo(1))
21+
.build()
22+
.render(RenderingStrategies.MYBATIS3);
23+
```
24+
25+
Note the phrase `and(orderLine.orderId, equalTo(1))` which will be rendered with a bound SQL parameter. Currently, this
26+
capability is limited to equality only. If you have a use for other functions (not equal, less then, greater than, etc.)
27+
please let us know.
28+
29+
In order to add this capability, we've modified the join DSL to add type information to the join columns. This should
30+
be source code compatible with most uses. There could be an issue if you are joining tables with columns of different
31+
types - which is a rare usage. Please let us know if this causes an undo hardship.
32+
533
## Release 1.5.0 - April 21, 2023
634

735
GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/milestone/12?closed=1](https://github.com/mybatis/mybatis-dynamic-sql/milestone/12?closed=1)

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
<checkstyle.config>checkstyle-override.xml</checkstyle.config>
5959

60-
<clirr.comparisonVersion>1.2.0</clirr.comparisonVersion>
60+
<clirr.comparisonVersion>1.5.0</clirr.comparisonVersion>
6161

6262
<module.name>org.mybatis.dynamic.sql</module.name>
6363

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.mybatis.dynamic.sql.select.function.Subtract;
5555
import org.mybatis.dynamic.sql.select.function.Upper;
5656
import org.mybatis.dynamic.sql.select.join.EqualTo;
57+
import org.mybatis.dynamic.sql.select.join.EqualToValue;
5758
import org.mybatis.dynamic.sql.select.join.JoinCondition;
5859
import org.mybatis.dynamic.sql.select.join.JoinCriterion;
5960
import org.mybatis.dynamic.sql.update.UpdateDSL;
@@ -425,24 +426,28 @@ static AndOrCriteriaGroup and(List<AndOrCriteriaGroup> subCriteria) {
425426
}
426427

427428
// join support
428-
static JoinCriterion and(BasicColumn joinColumn, JoinCondition joinCondition) {
429-
return new JoinCriterion.Builder()
429+
static <T> JoinCriterion<T> and(BindableColumn<T> joinColumn, JoinCondition<T> joinCondition) {
430+
return new JoinCriterion.Builder<T>()
430431
.withConnector("and") //$NON-NLS-1$
431432
.withJoinColumn(joinColumn)
432433
.withJoinCondition(joinCondition)
433434
.build();
434435
}
435436

436-
static JoinCriterion on(BasicColumn joinColumn, JoinCondition joinCondition) {
437-
return new JoinCriterion.Builder()
437+
static <T> JoinCriterion<T> on(BindableColumn<T> joinColumn, JoinCondition<T> joinCondition) {
438+
return new JoinCriterion.Builder<T>()
438439
.withConnector("on") //$NON-NLS-1$
439440
.withJoinColumn(joinColumn)
440441
.withJoinCondition(joinCondition)
441442
.build();
442443
}
443444

444-
static EqualTo equalTo(BasicColumn column) {
445-
return new EqualTo(column);
445+
static <T> EqualTo<T> equalTo(BindableColumn<T> column) {
446+
return new EqualTo<>(column);
447+
}
448+
449+
static <T> EqualToValue<T> equalTo(T value) {
450+
return new EqualToValue<>(value);
446451
}
447452

448453
// aggregate support

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

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -52,132 +52,132 @@ public TableExpression table() {
5252
return table;
5353
}
5454

55-
public T join(SqlTable joinTable, JoinCriterion onJoinCriterion,
56-
JoinCriterion... andJoinCriteria) {
55+
public T join(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
56+
JoinCriterion<?>... andJoinCriteria) {
5757
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.INNER, Arrays.asList(andJoinCriteria));
5858
return getThis();
5959
}
6060

61-
public T join(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
62-
JoinCriterion... andJoinCriteria) {
61+
public T join(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
62+
JoinCriterion<?>... andJoinCriteria) {
6363
addTableAlias(joinTable, tableAlias);
6464
return join(joinTable, onJoinCriterion, andJoinCriteria);
6565
}
6666

67-
public T join(SqlTable joinTable, JoinCriterion onJoinCriterion,
68-
List<JoinCriterion> andJoinCriteria) {
67+
public T join(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
68+
List<JoinCriterion<?>> andJoinCriteria) {
6969
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.INNER, andJoinCriteria);
7070
return getThis();
7171
}
7272

73-
public T join(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
74-
List<JoinCriterion> andJoinCriteria) {
73+
public T join(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
74+
List<JoinCriterion<?>> andJoinCriteria) {
7575
addTableAlias(joinTable, tableAlias);
7676
return join(joinTable, onJoinCriterion, andJoinCriteria);
7777
}
7878

79-
public T join(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion onJoinCriterion,
80-
List<JoinCriterion> andJoinCriteria) {
79+
public T join(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion<?> onJoinCriterion,
80+
List<JoinCriterion<?>> andJoinCriteria) {
8181
addJoinSpecificationBuilder(buildSubQuery(subQuery, tableAlias), onJoinCriterion, JoinType.INNER,
8282
andJoinCriteria);
8383
return getThis();
8484
}
8585

86-
public T leftJoin(SqlTable joinTable, JoinCriterion onJoinCriterion,
87-
JoinCriterion... andJoinCriteria) {
86+
public T leftJoin(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
87+
JoinCriterion<?>... andJoinCriteria) {
8888
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.LEFT, Arrays.asList(andJoinCriteria));
8989
return getThis();
9090
}
9191

92-
public T leftJoin(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
93-
JoinCriterion... andJoinCriteria) {
92+
public T leftJoin(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
93+
JoinCriterion<?>... andJoinCriteria) {
9494
addTableAlias(joinTable, tableAlias);
9595
return leftJoin(joinTable, onJoinCriterion, andJoinCriteria);
9696
}
9797

98-
public T leftJoin(SqlTable joinTable, JoinCriterion onJoinCriterion,
99-
List<JoinCriterion> andJoinCriteria) {
98+
public T leftJoin(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
99+
List<JoinCriterion<?>> andJoinCriteria) {
100100
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.LEFT, andJoinCriteria);
101101
return getThis();
102102
}
103103

104-
public T leftJoin(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
105-
List<JoinCriterion> andJoinCriteria) {
104+
public T leftJoin(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
105+
List<JoinCriterion<?>> andJoinCriteria) {
106106
addTableAlias(joinTable, tableAlias);
107107
return leftJoin(joinTable, onJoinCriterion, andJoinCriteria);
108108
}
109109

110-
public T leftJoin(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion onJoinCriterion,
111-
List<JoinCriterion> andJoinCriteria) {
110+
public T leftJoin(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion<?> onJoinCriterion,
111+
List<JoinCriterion<?>> andJoinCriteria) {
112112
addJoinSpecificationBuilder(buildSubQuery(subQuery, tableAlias), onJoinCriterion, JoinType.LEFT,
113113
andJoinCriteria);
114114
return getThis();
115115
}
116116

117-
public T rightJoin(SqlTable joinTable, JoinCriterion onJoinCriterion,
118-
JoinCriterion... andJoinCriteria) {
117+
public T rightJoin(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
118+
JoinCriterion<?>... andJoinCriteria) {
119119
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.RIGHT, Arrays.asList(andJoinCriteria));
120120
return getThis();
121121
}
122122

123-
public T rightJoin(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
124-
JoinCriterion... andJoinCriteria) {
123+
public T rightJoin(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
124+
JoinCriterion<?>... andJoinCriteria) {
125125
addTableAlias(joinTable, tableAlias);
126126
return rightJoin(joinTable, onJoinCriterion, andJoinCriteria);
127127
}
128128

129-
public T rightJoin(SqlTable joinTable, JoinCriterion onJoinCriterion,
130-
List<JoinCriterion> andJoinCriteria) {
129+
public T rightJoin(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
130+
List<JoinCriterion<?>> andJoinCriteria) {
131131
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.RIGHT, andJoinCriteria);
132132
return getThis();
133133
}
134134

135-
public T rightJoin(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
136-
List<JoinCriterion> andJoinCriteria) {
135+
public T rightJoin(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
136+
List<JoinCriterion<?>> andJoinCriteria) {
137137
addTableAlias(joinTable, tableAlias);
138138
return rightJoin(joinTable, onJoinCriterion, andJoinCriteria);
139139
}
140140

141-
public T rightJoin(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion onJoinCriterion,
142-
List<JoinCriterion> andJoinCriteria) {
141+
public T rightJoin(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion<?> onJoinCriterion,
142+
List<JoinCriterion<?>> andJoinCriteria) {
143143
addJoinSpecificationBuilder(buildSubQuery(subQuery, tableAlias), onJoinCriterion, JoinType.RIGHT,
144144
andJoinCriteria);
145145
return getThis();
146146
}
147147

148-
public T fullJoin(SqlTable joinTable, JoinCriterion onJoinCriterion,
149-
JoinCriterion... andJoinCriteria) {
148+
public T fullJoin(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
149+
JoinCriterion<?>... andJoinCriteria) {
150150
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.FULL, Arrays.asList(andJoinCriteria));
151151
return getThis();
152152
}
153153

154-
public T fullJoin(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
155-
JoinCriterion... andJoinCriteria) {
154+
public T fullJoin(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
155+
JoinCriterion<?>... andJoinCriteria) {
156156
addTableAlias(joinTable, tableAlias);
157157
return fullJoin(joinTable, onJoinCriterion, andJoinCriteria);
158158
}
159159

160-
public T fullJoin(SqlTable joinTable, JoinCriterion onJoinCriterion,
161-
List<JoinCriterion> andJoinCriteria) {
160+
public T fullJoin(SqlTable joinTable, JoinCriterion<?> onJoinCriterion,
161+
List<JoinCriterion<?>> andJoinCriteria) {
162162
addJoinSpecificationBuilder(joinTable, onJoinCriterion, JoinType.FULL, andJoinCriteria);
163163
return getThis();
164164
}
165165

166-
public T fullJoin(SqlTable joinTable, String tableAlias, JoinCriterion onJoinCriterion,
167-
List<JoinCriterion> andJoinCriteria) {
166+
public T fullJoin(SqlTable joinTable, String tableAlias, JoinCriterion<?> onJoinCriterion,
167+
List<JoinCriterion<?>> andJoinCriteria) {
168168
addTableAlias(joinTable, tableAlias);
169169
return fullJoin(joinTable, onJoinCriterion, andJoinCriteria);
170170
}
171171

172-
public T fullJoin(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion onJoinCriterion,
173-
List<JoinCriterion> andJoinCriteria) {
172+
public T fullJoin(Buildable<SelectModel> subQuery, String tableAlias, JoinCriterion<?> onJoinCriterion,
173+
List<JoinCriterion<?>> andJoinCriteria) {
174174
addJoinSpecificationBuilder(buildSubQuery(subQuery, tableAlias), onJoinCriterion, JoinType.FULL,
175175
andJoinCriteria);
176176
return getThis();
177177
}
178178

179-
private void addJoinSpecificationBuilder(TableExpression joinTable, JoinCriterion onJoinCriterion,
180-
JoinType joinType, List<JoinCriterion> andJoinCriteria) {
179+
private void addJoinSpecificationBuilder(TableExpression joinTable, JoinCriterion<?> onJoinCriterion,
180+
JoinType joinType, List<JoinCriterion<?>> andJoinCriteria) {
181181
joinSpecificationBuilders.add(new JoinSpecification.Builder()
182182
.withJoinTable(joinTable)
183183
.withJoinType(joinType)

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import org.jetbrains.annotations.NotNull;
2626
import org.mybatis.dynamic.sql.BasicColumn;
27+
import org.mybatis.dynamic.sql.BindableColumn;
2728
import org.mybatis.dynamic.sql.CriteriaGroup;
2829
import org.mybatis.dynamic.sql.SortSpecification;
2930
import org.mybatis.dynamic.sql.SqlTable;
@@ -349,12 +350,12 @@ public JoinSpecificationStarter(TableExpression joinTable, JoinType joinType) {
349350
this.joinType = joinType;
350351
}
351352

352-
public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCondition) {
353+
public <T> JoinSpecificationFinisher on(BindableColumn<T> joinColumn, JoinCondition<T> joinCondition) {
353354
return new JoinSpecificationFinisher(joinTable, joinColumn, joinCondition, joinType);
354355
}
355356

356-
public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition onJoinCondition,
357-
JoinCriterion... andJoinCriteria) {
357+
public <T> JoinSpecificationFinisher on(BindableColumn<T> joinColumn, JoinCondition<T> onJoinCondition,
358+
JoinCriterion<?>... andJoinCriteria) {
358359
return new JoinSpecificationFinisher(joinTable, joinColumn, onJoinCondition, joinType, andJoinCriteria);
359360
}
360361
}
@@ -364,9 +365,9 @@ public class JoinSpecificationFinisher
364365
implements Buildable<R> {
365366
private final JoinSpecification.Builder joinSpecificationBuilder;
366367

367-
public JoinSpecificationFinisher(TableExpression table, BasicColumn joinColumn,
368-
JoinCondition joinCondition, JoinType joinType) {
369-
JoinCriterion joinCriterion = new JoinCriterion.Builder()
368+
public <T> JoinSpecificationFinisher(TableExpression table, BindableColumn<T> joinColumn,
369+
JoinCondition<T> joinCondition, JoinType joinType) {
370+
JoinCriterion<T> joinCriterion = new JoinCriterion.Builder<T>()
370371
.withConnector("on") //$NON-NLS-1$
371372
.withJoinColumn(joinColumn)
372373
.withJoinCondition(joinCondition)
@@ -379,9 +380,9 @@ public JoinSpecificationFinisher(TableExpression table, BasicColumn joinColumn,
379380
addJoinSpecificationBuilder(joinSpecificationBuilder);
380381
}
381382

382-
public JoinSpecificationFinisher(TableExpression table, BasicColumn joinColumn,
383-
JoinCondition joinCondition, JoinType joinType, JoinCriterion... andJoinCriteria) {
384-
JoinCriterion onJoinCriterion = new JoinCriterion.Builder()
383+
public <T> JoinSpecificationFinisher(TableExpression table, BindableColumn<T> joinColumn,
384+
JoinCondition<T> joinCondition, JoinType joinType, JoinCriterion<?>... andJoinCriteria) {
385+
JoinCriterion<T> onJoinCriterion = new JoinCriterion.Builder<T>()
385386
.withConnector("on") //$NON-NLS-1$
386387
.withJoinColumn(joinColumn)
387388
.withJoinCondition(joinCondition)
@@ -412,8 +413,8 @@ public QueryExpressionWhereBuilder where() {
412413
return QueryExpressionDSL.this.where();
413414
}
414415

415-
public JoinSpecificationFinisher and(BasicColumn joinColumn, JoinCondition joinCondition) {
416-
JoinCriterion joinCriterion = new JoinCriterion.Builder()
416+
public <T> JoinSpecificationFinisher and(BindableColumn<T> joinColumn, JoinCondition<T> joinCondition) {
417+
JoinCriterion<T> joinCriterion = new JoinCriterion.Builder<T>()
417418
.withConnector("and") //$NON-NLS-1$
418419
.withJoinColumn(joinColumn)
419420
.withJoinCondition(joinCondition)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2016-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.select.join;
17+
18+
import java.util.Objects;
19+
20+
import org.mybatis.dynamic.sql.BasicColumn;
21+
22+
public abstract class ColumnBasedJoinCondition<T> implements JoinCondition<T> {
23+
private final BasicColumn rightColumn;
24+
25+
protected ColumnBasedJoinCondition(BasicColumn rightColumn) {
26+
this.rightColumn = Objects.requireNonNull(rightColumn);
27+
}
28+
29+
public BasicColumn rightColumn() {
30+
return rightColumn;
31+
}
32+
33+
@Override
34+
public <R> R accept(JoinConditionVisitor<T, R> visitor) {
35+
return visitor.visit(this);
36+
}
37+
}

src/main/java/org/mybatis/dynamic/sql/select/join/EqualTo.java

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

1818
import org.mybatis.dynamic.sql.BasicColumn;
1919

20-
public class EqualTo extends JoinCondition {
20+
public class EqualTo<T> extends ColumnBasedJoinCondition<T> {
2121

2222
public EqualTo(BasicColumn rightColumn) {
2323
super(rightColumn);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright 2016-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.mybatis.dynamic.sql.select.join;
17+
18+
public class EqualToValue<T> extends TypedJoinCondition<T> {
19+
public EqualToValue(T value) {
20+
super(value);
21+
}
22+
23+
@Override
24+
public String operator() {
25+
return "="; //$NON-NLS-1$
26+
}
27+
}

0 commit comments

Comments
 (0)