23
23
import java .util .Map ;
24
24
import java .util .Objects ;
25
25
import java .util .Optional ;
26
+ import java .util .function .Supplier ;
26
27
28
+ import org .mybatis .dynamic .sql .AndOrCriteriaGroup ;
29
+ import org .mybatis .dynamic .sql .SqlCriterion ;
27
30
import org .mybatis .dynamic .sql .SqlTable ;
28
31
import org .mybatis .dynamic .sql .TableExpression ;
29
32
import org .mybatis .dynamic .sql .exception .DuplicateTableAliasException ;
30
- import org .mybatis .dynamic .sql .select .join .JoinCriterion ;
31
33
import org .mybatis .dynamic .sql .select .join .JoinModel ;
32
34
import org .mybatis .dynamic .sql .select .join .JoinSpecification ;
33
35
import org .mybatis .dynamic .sql .select .join .JoinType ;
37
39
38
40
public abstract class AbstractQueryExpressionDSL <W extends AbstractWhereFinisher <?>,
39
41
T extends AbstractQueryExpressionDSL <W , T >>
40
- extends AbstractWhereStarter <W , T > {
42
+ implements AbstractWhereStarter <W , T > {
41
43
42
- private final List <JoinSpecification . Builder > joinSpecificationBuilders = new ArrayList <>();
44
+ private final List <Supplier < JoinSpecification >> joinSpecificationSuppliers = new ArrayList <>();
43
45
private final Map <SqlTable , String > tableAliases = new HashMap <>();
44
46
private final TableExpression table ;
45
47
@@ -51,151 +53,151 @@ public TableExpression table() {
51
53
return table ;
52
54
}
53
55
54
- public T join (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
55
- JoinCriterion <?> ... andJoinCriteria ) {
56
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .INNER , Arrays .asList (andJoinCriteria ));
56
+ public T join (SqlTable joinTable , SqlCriterion onJoinCriterion ,
57
+ AndOrCriteriaGroup ... andJoinCriteria ) {
58
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .INNER , Arrays .asList (andJoinCriteria ));
57
59
return getThis ();
58
60
}
59
61
60
- public T join (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
61
- JoinCriterion <?> ... andJoinCriteria ) {
62
+ public T join (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
63
+ AndOrCriteriaGroup ... andJoinCriteria ) {
62
64
addTableAlias (joinTable , tableAlias );
63
65
return join (joinTable , onJoinCriterion , andJoinCriteria );
64
66
}
65
67
66
- public T join (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
67
- List <JoinCriterion <?> > andJoinCriteria ) {
68
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .INNER , andJoinCriteria );
68
+ public T join (SqlTable joinTable , SqlCriterion onJoinCriterion ,
69
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
70
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .INNER , andJoinCriteria );
69
71
return getThis ();
70
72
}
71
73
72
- public T join (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
73
- List <JoinCriterion <?> > andJoinCriteria ) {
74
+ public T join (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
75
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
74
76
addTableAlias (joinTable , tableAlias );
75
77
return join (joinTable , onJoinCriterion , andJoinCriteria );
76
78
}
77
79
78
- public T join (Buildable <SelectModel > subQuery , String tableAlias , JoinCriterion <?> onJoinCriterion ,
79
- List <JoinCriterion <?> > andJoinCriteria ) {
80
- addJoinSpecificationBuilder (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .INNER ,
80
+ public T join (Buildable <SelectModel > subQuery , String tableAlias , SqlCriterion onJoinCriterion ,
81
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
82
+ addJoinSpecificationSupplier (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .INNER ,
81
83
andJoinCriteria );
82
84
return getThis ();
83
85
}
84
86
85
- public T leftJoin (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
86
- JoinCriterion <?> ... andJoinCriteria ) {
87
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .LEFT , Arrays .asList (andJoinCriteria ));
87
+ public T leftJoin (SqlTable joinTable , SqlCriterion onJoinCriterion ,
88
+ AndOrCriteriaGroup ... andJoinCriteria ) {
89
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .LEFT , Arrays .asList (andJoinCriteria ));
88
90
return getThis ();
89
91
}
90
92
91
- public T leftJoin (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
92
- JoinCriterion <?> ... andJoinCriteria ) {
93
+ public T leftJoin (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
94
+ AndOrCriteriaGroup ... andJoinCriteria ) {
93
95
addTableAlias (joinTable , tableAlias );
94
96
return leftJoin (joinTable , onJoinCriterion , andJoinCriteria );
95
97
}
96
98
97
- public T leftJoin (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
98
- List <JoinCriterion <?> > andJoinCriteria ) {
99
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .LEFT , andJoinCriteria );
99
+ public T leftJoin (SqlTable joinTable , SqlCriterion onJoinCriterion ,
100
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
101
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .LEFT , andJoinCriteria );
100
102
return getThis ();
101
103
}
102
104
103
- public T leftJoin (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
104
- List <JoinCriterion <?> > andJoinCriteria ) {
105
+ public T leftJoin (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
106
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
105
107
addTableAlias (joinTable , tableAlias );
106
108
return leftJoin (joinTable , onJoinCriterion , andJoinCriteria );
107
109
}
108
110
109
- public T leftJoin (Buildable <SelectModel > subQuery , String tableAlias , JoinCriterion <?> onJoinCriterion ,
110
- List <JoinCriterion <?> > andJoinCriteria ) {
111
- addJoinSpecificationBuilder (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .LEFT ,
111
+ public T leftJoin (Buildable <SelectModel > subQuery , String tableAlias , SqlCriterion onJoinCriterion ,
112
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
113
+ addJoinSpecificationSupplier (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .LEFT ,
112
114
andJoinCriteria );
113
115
return getThis ();
114
116
}
115
117
116
- public T rightJoin (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
117
- JoinCriterion <?> ... andJoinCriteria ) {
118
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .RIGHT , Arrays .asList (andJoinCriteria ));
118
+ public T rightJoin (SqlTable joinTable , SqlCriterion onJoinCriterion ,
119
+ AndOrCriteriaGroup ... andJoinCriteria ) {
120
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .RIGHT , Arrays .asList (andJoinCriteria ));
119
121
return getThis ();
120
122
}
121
123
122
- public T rightJoin (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
123
- JoinCriterion <?> ... andJoinCriteria ) {
124
+ public T rightJoin (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
125
+ AndOrCriteriaGroup ... andJoinCriteria ) {
124
126
addTableAlias (joinTable , tableAlias );
125
127
return rightJoin (joinTable , onJoinCriterion , andJoinCriteria );
126
128
}
127
129
128
- public T rightJoin (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
129
- List <JoinCriterion <?> > andJoinCriteria ) {
130
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .RIGHT , andJoinCriteria );
130
+ public T rightJoin (SqlTable joinTable , SqlCriterion onJoinCriterion ,
131
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
132
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .RIGHT , andJoinCriteria );
131
133
return getThis ();
132
134
}
133
135
134
- public T rightJoin (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
135
- List <JoinCriterion <?> > andJoinCriteria ) {
136
+ public T rightJoin (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
137
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
136
138
addTableAlias (joinTable , tableAlias );
137
139
return rightJoin (joinTable , onJoinCriterion , andJoinCriteria );
138
140
}
139
141
140
- public T rightJoin (Buildable <SelectModel > subQuery , String tableAlias , JoinCriterion <?> onJoinCriterion ,
141
- List <JoinCriterion <?> > andJoinCriteria ) {
142
- addJoinSpecificationBuilder (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .RIGHT ,
142
+ public T rightJoin (Buildable <SelectModel > subQuery , String tableAlias , SqlCriterion onJoinCriterion ,
143
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
144
+ addJoinSpecificationSupplier (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .RIGHT ,
143
145
andJoinCriteria );
144
146
return getThis ();
145
147
}
146
148
147
- public T fullJoin (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
148
- JoinCriterion <?> ... andJoinCriteria ) {
149
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .FULL , Arrays .asList (andJoinCriteria ));
149
+ public T fullJoin (SqlTable joinTable , SqlCriterion onJoinCriterion ,
150
+ AndOrCriteriaGroup ... andJoinCriteria ) {
151
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .FULL , Arrays .asList (andJoinCriteria ));
150
152
return getThis ();
151
153
}
152
154
153
- public T fullJoin (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
154
- JoinCriterion <?> ... andJoinCriteria ) {
155
+ public T fullJoin (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
156
+ AndOrCriteriaGroup ... andJoinCriteria ) {
155
157
addTableAlias (joinTable , tableAlias );
156
158
return fullJoin (joinTable , onJoinCriterion , andJoinCriteria );
157
159
}
158
160
159
- public T fullJoin (SqlTable joinTable , JoinCriterion <?> onJoinCriterion ,
160
- List <JoinCriterion <?> > andJoinCriteria ) {
161
- addJoinSpecificationBuilder (joinTable , onJoinCriterion , JoinType .FULL , andJoinCriteria );
161
+ public T fullJoin (SqlTable joinTable , SqlCriterion onJoinCriterion ,
162
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
163
+ addJoinSpecificationSupplier (joinTable , onJoinCriterion , JoinType .FULL , andJoinCriteria );
162
164
return getThis ();
163
165
}
164
166
165
- public T fullJoin (SqlTable joinTable , String tableAlias , JoinCriterion <?> onJoinCriterion ,
166
- List <JoinCriterion <?> > andJoinCriteria ) {
167
+ public T fullJoin (SqlTable joinTable , String tableAlias , SqlCriterion onJoinCriterion ,
168
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
167
169
addTableAlias (joinTable , tableAlias );
168
170
return fullJoin (joinTable , onJoinCriterion , andJoinCriteria );
169
171
}
170
172
171
- public T fullJoin (Buildable <SelectModel > subQuery , String tableAlias , JoinCriterion <?> onJoinCriterion ,
172
- List <JoinCriterion <?> > andJoinCriteria ) {
173
- addJoinSpecificationBuilder (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .FULL ,
173
+ public T fullJoin (Buildable <SelectModel > subQuery , String tableAlias , SqlCriterion onJoinCriterion ,
174
+ List <AndOrCriteriaGroup > andJoinCriteria ) {
175
+ addJoinSpecificationSupplier (buildSubQuery (subQuery , tableAlias ), onJoinCriterion , JoinType .FULL ,
174
176
andJoinCriteria );
175
177
return getThis ();
176
178
}
177
179
178
- private void addJoinSpecificationBuilder (TableExpression joinTable , JoinCriterion <?> onJoinCriterion ,
179
- JoinType joinType , List <JoinCriterion <?> > andJoinCriteria ) {
180
- joinSpecificationBuilders .add (new JoinSpecification .Builder ()
180
+ private void addJoinSpecificationSupplier (TableExpression joinTable , SqlCriterion onJoinCriterion ,
181
+ JoinType joinType , List <AndOrCriteriaGroup > andJoinCriteria ) {
182
+ joinSpecificationSuppliers .add (() -> new JoinSpecification .Builder ()
181
183
.withJoinTable (joinTable )
182
184
.withJoinType (joinType )
183
- .withJoinCriterion (onJoinCriterion )
184
- .withJoinCriteria (andJoinCriteria ));
185
+ .withInitialCriterion (onJoinCriterion )
186
+ .withSubCriteria (andJoinCriteria ). build ( ));
185
187
}
186
188
187
- protected void addJoinSpecificationBuilder ( JoinSpecification . Builder builder ) {
188
- joinSpecificationBuilders .add (builder );
189
+ protected void addJoinSpecificationSupplier ( Supplier < JoinSpecification > joinSpecificationSupplier ) {
190
+ joinSpecificationSuppliers .add (joinSpecificationSupplier );
189
191
}
190
192
191
193
protected Optional <JoinModel > buildJoinModel () {
192
- if (joinSpecificationBuilders .isEmpty ()) {
194
+ if (joinSpecificationSuppliers .isEmpty ()) {
193
195
return Optional .empty ();
194
196
}
195
197
196
- return Optional .of (JoinModel .of (joinSpecificationBuilders .stream ()
197
- .map (JoinSpecification . Builder :: build )
198
- .toList ()));
198
+ return Optional .of (JoinModel .of (joinSpecificationSuppliers .stream ()
199
+ .map (Supplier :: get )
200
+ .toList ()));
199
201
}
200
202
201
203
protected void addTableAlias (SqlTable table , String tableAlias ) {
0 commit comments