View Javadoc
1   /*
2    *    Copyright 2016-2025 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 issues.gh100;
17  
18  import static org.assertj.core.api.Assertions.assertThat;
19  import static org.mybatis.dynamic.sql.SqlBuilder.*;
20  
21  import org.junit.jupiter.api.Test;
22  import org.mybatis.dynamic.sql.render.RenderingStrategies;
23  import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
24  import org.mybatis.dynamic.sql.select.SelectDSL;
25  import org.mybatis.dynamic.sql.select.SelectModel;
26  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
27  
28  class FromJoinWhereTest {
29  
30      @Test
31      void testNormalUsage() {
32          SelectStatementProvider selectStatement = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
33                  .from(StudentDynamicSqlSupport.student)
34                  .join(StudentRegDynamicSqlSupport.studentReg)
35                  .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
36                  .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"))
37                  .union()
38                  .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
39                  .from(StudentDynamicSqlSupport.student)
40                  .orderBy(StudentDynamicSqlSupport.id)
41                  .limit(3)
42                  .offset(2)
43                  .build()
44                  .render(RenderingStrategies.MYBATIS3);
45  
46          String expected = "select student.id, student.name, student.idcard"
47                  + " from student"
48                  + " join student_reg on student.id = student_reg.studentId"
49                  + " where student.idcard = #{parameters.p1}"
50                  + " union"
51                  + " select id, name, idcard"
52                  + " from student"
53                  + " order by id"
54                  + " limit #{parameters.p2}"
55                  + " offset #{parameters.p3}";
56  
57          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
58      }
59  
60      @Test
61      void testFrom() {
62          QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
63                  .from(StudentDynamicSqlSupport.student);
64  
65          String expected = "select id, name, idcard"
66                  + " from student";
67  
68          SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
69  
70          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
71      }
72  
73      @Test
74      void testFromJoinB1() {
75          QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
76                  .from(StudentDynamicSqlSupport.student);
77  
78          builder1.join(StudentRegDynamicSqlSupport.studentReg)
79                  .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
80  
81          String expected = "select student.id, student.name, student.idcard"
82                  + " from student"
83                  + " join student_reg on student.id = student_reg.studentId";
84  
85          SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
86  
87          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
88      }
89  
90      @Test
91      void testFromJoinB2() {
92          QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
93                  .from(StudentDynamicSqlSupport.student);
94  
95          QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
96                  .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
97  
98          String expected = "select student.id, student.name, student.idcard"
99                  + " from student"
100                 + " join student_reg on student.id = student_reg.studentId";
101 
102         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
103 
104         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
105     }
106 
107     @Test
108     void testfromJoinWhereB1() {
109         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
110                 .from(StudentDynamicSqlSupport.student);
111 
112         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
113                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
114 
115         builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
116 
117         String expected = "select student.id, student.name, student.idcard"
118                 + " from student"
119                 + " join student_reg on student.id = student_reg.studentId"
120                 + " where student.idcard = #{parameters.p1}";
121 
122         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
123 
124         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
125     }
126 
127     @Test
128     void testfromJoinWhereB2() {
129         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
130                 .from(StudentDynamicSqlSupport.student);
131 
132         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
133                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
134 
135         builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
136 
137         String expected = "select student.id, student.name, student.idcard"
138                 + " from student"
139                 + " join student_reg on student.id = student_reg.studentId"
140                 + " where student.idcard = #{parameters.p1}";
141 
142         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
143 
144         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
145     }
146 
147     @Test
148     void testfromJoinWhereB3() {
149         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
150                 .from(StudentDynamicSqlSupport.student);
151 
152         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
153                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
154 
155         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
156 
157         String expected = "select student.id, student.name, student.idcard"
158                 + " from student"
159                 + " join student_reg on student.id = student_reg.studentId"
160                 + " where student.idcard = #{parameters.p1}";
161 
162         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
163 
164         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
165     }
166 
167     @Test
168     void testFromJoinWhereUnionB1() {
169         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
170                 .from(StudentDynamicSqlSupport.student);
171 
172         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
173                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
174 
175         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
176 
177         builder3.union()
178                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
179                 .from(StudentDynamicSqlSupport.student);
180 
181         String expected = "select student.id, student.name, student.idcard"
182                 + " from student"
183                 + " join student_reg on student.id = student_reg.studentId"
184                 + " where student.idcard = #{parameters.p1}"
185                 + " union"
186                 + " select id, name, idcard"
187                 + " from student";
188 
189         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
190 
191         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
192     }
193 
194     @Test
195     void testFromJoinWhereUnionB2() {
196         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
197                 .from(StudentDynamicSqlSupport.student);
198 
199         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
200                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
201 
202         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
203 
204         builder3.union()
205                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
206                 .from(StudentDynamicSqlSupport.student);
207 
208         String expected = "select student.id, student.name, student.idcard"
209                 + " from student"
210                 + " join student_reg on student.id = student_reg.studentId"
211                 + " where student.idcard = #{parameters.p1}"
212                 + " union"
213                 + " select id, name, idcard"
214                 + " from student";
215 
216         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
217 
218         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
219     }
220 
221     @Test
222     void testFromJoinWhereUnionB3() {
223         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
224                 .from(StudentDynamicSqlSupport.student);
225 
226         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
227                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
228 
229         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
230 
231         builder3.union()
232                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
233                 .from(StudentDynamicSqlSupport.student);
234 
235         String expected = "select student.id, student.name, student.idcard"
236                 + " from student"
237                 + " join student_reg on student.id = student_reg.studentId"
238                 + " where student.idcard = #{parameters.p1}"
239                 + " union"
240                 + " select id, name, idcard"
241                 + " from student";
242 
243         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
244 
245         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
246     }
247 
248     @Test
249     void testFromJoinWhereUnionB4() {
250         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
251                 .from(StudentDynamicSqlSupport.student);
252 
253         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
254                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
255 
256         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
257 
258         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
259                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
260                 .from(StudentDynamicSqlSupport.student);
261 
262         String expected = "select student.id, student.name, student.idcard"
263                 + " from student"
264                 + " join student_reg on student.id = student_reg.studentId"
265                 + " where student.idcard = #{parameters.p1}"
266                 + " union"
267                 + " select id, name, idcard"
268                 + " from student";
269 
270         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
271 
272         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
273     }
274 
275     @Test
276     void testFromJoinWhereUnionUnionB1() {
277         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
278                 .from(StudentDynamicSqlSupport.student);
279 
280         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
281                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
282 
283         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
284 
285         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder4 = builder3.union()
286                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
287                 .from(StudentDynamicSqlSupport.student)
288                 .where(StudentDynamicSqlSupport.id, isNotNull());
289 
290         builder4.union()
291                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
292                 .from(StudentDynamicSqlSupport.student)
293                 .where(StudentDynamicSqlSupport.id, isNull());
294 
295         String expected = "select student.id, student.name, student.idcard"
296                 + " from student"
297                 + " join student_reg on student.id = student_reg.studentId"
298                 + " where student.idcard = #{parameters.p1}"
299                 + " union"
300                 + " select id, name, idcard"
301                 + " from student"
302                 + " where id is not null"
303                 + " union"
304                 + " select id, name, idcard"
305                 + " from student"
306                 + " where id is null";
307 
308         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
309 
310         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
311     }
312 
313     @Test
314     void testFromJoinWhereUnionUnionB2() {
315         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
316                 .from(StudentDynamicSqlSupport.student);
317 
318         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
319                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
320 
321         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
322 
323         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder4 = builder3.union()
324                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
325                 .from(StudentDynamicSqlSupport.student)
326                 .where(StudentDynamicSqlSupport.id, isNotNull());
327 
328         builder4.union()
329                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
330                 .from(StudentDynamicSqlSupport.student)
331                 .where(StudentDynamicSqlSupport.id, isNull());
332 
333         String expected = "select student.id, student.name, student.idcard"
334                 + " from student"
335                 + " join student_reg on student.id = student_reg.studentId"
336                 + " where student.idcard = #{parameters.p1}"
337                 + " union"
338                 + " select id, name, idcard"
339                 + " from student"
340                 + " where id is not null"
341                 + " union"
342                 + " select id, name, idcard"
343                 + " from student"
344                 + " where id is null";
345 
346         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
347 
348         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
349     }
350 
351     @Test
352     void testFromJoinWhereUnionUnionB3() {
353         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
354                 .from(StudentDynamicSqlSupport.student);
355 
356         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
357                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
358 
359         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
360 
361         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder4 = builder3.union()
362                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
363                 .from(StudentDynamicSqlSupport.student)
364                 .where(StudentDynamicSqlSupport.id, isNotNull());
365 
366         builder4.union()
367                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
368                 .from(StudentDynamicSqlSupport.student)
369                 .where(StudentDynamicSqlSupport.id, isNull());
370 
371         String expected = "select student.id, student.name, student.idcard"
372                 + " from student"
373                 + " join student_reg on student.id = student_reg.studentId"
374                 + " where student.idcard = #{parameters.p1}"
375                 + " union"
376                 + " select id, name, idcard"
377                 + " from student"
378                 + " where id is not null"
379                 + " union"
380                 + " select id, name, idcard"
381                 + " from student"
382                 + " where id is null";
383 
384         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
385 
386         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
387     }
388 
389     @Test
390     void testFromJoinWhereUnionUnionB4() {
391         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
392                 .from(StudentDynamicSqlSupport.student);
393 
394         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
395                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
396 
397         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
398 
399         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder4 = builder3.union()
400                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
401                 .from(StudentDynamicSqlSupport.student)
402                 .where(StudentDynamicSqlSupport.id, isNotNull());
403 
404         builder4.union()
405                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
406                 .from(StudentDynamicSqlSupport.student)
407                 .where(StudentDynamicSqlSupport.id, isNull());
408 
409         String expected = "select student.id, student.name, student.idcard"
410                 + " from student"
411                 + " join student_reg on student.id = student_reg.studentId"
412                 + " where student.idcard = #{parameters.p1}"
413                 + " union"
414                 + " select id, name, idcard"
415                 + " from student"
416                 + " where id is not null"
417                 + " union"
418                 + " select id, name, idcard"
419                 + " from student"
420                 + " where id is null";
421 
422         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
423 
424         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
425     }
426 
427     @Test
428     void testFromJoinWhereUnionUnionB5() {
429         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
430                 .from(StudentDynamicSqlSupport.student);
431 
432         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
433                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
434 
435         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
436 
437         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder4 = builder3.union()
438                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
439                 .from(StudentDynamicSqlSupport.student)
440                 .where(StudentDynamicSqlSupport.id, isNotNull());
441 
442         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder5 = builder4.union()
443                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
444                 .from(StudentDynamicSqlSupport.student)
445                 .where(StudentDynamicSqlSupport.id, isNull());
446 
447         String expected = "select student.id, student.name, student.idcard"
448                 + " from student"
449                 + " join student_reg on student.id = student_reg.studentId"
450                 + " where student.idcard = #{parameters.p1}"
451                 + " union"
452                 + " select id, name, idcard"
453                 + " from student"
454                 + " where id is not null"
455                 + " union"
456                 + " select id, name, idcard"
457                 + " from student"
458                 + " where id is null";
459 
460         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
461 
462         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
463     }
464 
465     @Test
466     void testFromJoinWhereUnionOrderByB1() {
467         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
468                 .from(StudentDynamicSqlSupport.student);
469 
470         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
471                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
472 
473         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
474 
475         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
476                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
477                 .from(StudentDynamicSqlSupport.student);
478 
479         builder4.orderBy(StudentDynamicSqlSupport.id);
480 
481         String expected = "select student.id, student.name, student.idcard"
482                 + " from student"
483                 + " join student_reg on student.id = student_reg.studentId"
484                 + " where student.idcard = #{parameters.p1}"
485                 + " union"
486                 + " select id, name, idcard"
487                 + " from student"
488                 + " order by id";
489 
490         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
491 
492         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
493     }
494 
495     @Test
496     void testFromJoinWhereUnionOrderByB2() {
497         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
498                 .from(StudentDynamicSqlSupport.student);
499 
500         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
501                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
502 
503         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
504 
505         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
506                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
507                 .from(StudentDynamicSqlSupport.student);
508 
509         builder4.orderBy(StudentDynamicSqlSupport.id);
510 
511         String expected = "select student.id, student.name, student.idcard"
512                 + " from student"
513                 + " join student_reg on student.id = student_reg.studentId"
514                 + " where student.idcard = #{parameters.p1}"
515                 + " union"
516                 + " select id, name, idcard"
517                 + " from student"
518                 + " order by id";
519 
520         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
521 
522         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
523     }
524 
525     @Test
526     void testFromJoinWhereUnionOrderByB3() {
527         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
528                 .from(StudentDynamicSqlSupport.student);
529 
530         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
531                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
532 
533         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
534 
535         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
536                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
537                 .from(StudentDynamicSqlSupport.student);
538 
539         builder4.orderBy(StudentDynamicSqlSupport.id);
540 
541         String expected = "select student.id, student.name, student.idcard"
542                 + " from student"
543                 + " join student_reg on student.id = student_reg.studentId"
544                 + " where student.idcard = #{parameters.p1}"
545                 + " union"
546                 + " select id, name, idcard"
547                 + " from student"
548                 + " order by id";
549 
550         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
551 
552         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
553     }
554 
555     @Test
556     void testFromJoinWhereUnionOrderByB4() {
557         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
558                 .from(StudentDynamicSqlSupport.student);
559 
560         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
561                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
562 
563         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
564 
565         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
566                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
567                 .from(StudentDynamicSqlSupport.student);
568 
569         builder4.orderBy(StudentDynamicSqlSupport.id);
570 
571         String expected = "select student.id, student.name, student.idcard"
572                 + " from student"
573                 + " join student_reg on student.id = student_reg.studentId"
574                 + " where student.idcard = #{parameters.p1}"
575                 + " union"
576                 + " select id, name, idcard"
577                 + " from student"
578                 + " order by id";
579 
580         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
581 
582         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
583     }
584 
585     @Test
586     void testFromJoinWhereUnionOrderByB5() {
587         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
588                 .from(StudentDynamicSqlSupport.student);
589 
590         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
591                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
592 
593         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
594 
595         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
596                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
597                 .from(StudentDynamicSqlSupport.student);
598 
599         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
600 
601         String expected = "select student.id, student.name, student.idcard"
602                 + " from student"
603                 + " join student_reg on student.id = student_reg.studentId"
604                 + " where student.idcard = #{parameters.p1}"
605                 + " union"
606                 + " select id, name, idcard"
607                 + " from student"
608                 + " order by id";
609 
610         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
611 
612         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
613     }
614 
615     @Test
616     void testFromJoinWhereUnionOrderByLimitB1() {
617         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
618                 .from(StudentDynamicSqlSupport.student);
619 
620         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
621                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
622 
623         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
624 
625         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
626                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
627                 .from(StudentDynamicSqlSupport.student);
628 
629         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
630 
631         builder5.limit(3);
632 
633         String expected = "select student.id, student.name, student.idcard"
634                 + " from student"
635                 + " join student_reg on student.id = student_reg.studentId"
636                 + " where student.idcard = #{parameters.p1}"
637                 + " union"
638                 + " select id, name, idcard"
639                 + " from student"
640                 + " order by id"
641                 + " limit #{parameters.p2}";
642 
643         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
644 
645         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
646     }
647 
648     @Test
649     void testFromJoinWhereUnionOrderByLimitB2() {
650         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
651                 .from(StudentDynamicSqlSupport.student);
652 
653         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
654                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
655 
656         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
657 
658         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
659                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
660                 .from(StudentDynamicSqlSupport.student);
661 
662         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
663 
664         builder5.limit(3);
665 
666         String expected = "select student.id, student.name, student.idcard"
667                 + " from student"
668                 + " join student_reg on student.id = student_reg.studentId"
669                 + " where student.idcard = #{parameters.p1}"
670                 + " union"
671                 + " select id, name, idcard"
672                 + " from student"
673                 + " order by id"
674                 + " limit #{parameters.p2}";
675 
676         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
677 
678         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
679     }
680 
681     @Test
682     void testFromJoinWhereUnionOrderByLimitB3() {
683         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
684                 .from(StudentDynamicSqlSupport.student);
685 
686         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
687                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
688 
689         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
690 
691         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
692                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
693                 .from(StudentDynamicSqlSupport.student);
694 
695         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
696 
697         builder5.limit(3);
698 
699         String expected = "select student.id, student.name, student.idcard"
700                 + " from student"
701                 + " join student_reg on student.id = student_reg.studentId"
702                 + " where student.idcard = #{parameters.p1}"
703                 + " union"
704                 + " select id, name, idcard"
705                 + " from student"
706                 + " order by id"
707                 + " limit #{parameters.p2}";
708 
709         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
710 
711         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
712     }
713 
714     @Test
715     void testFromJoinWhereUnionOrderByLimitB4() {
716         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
717                 .from(StudentDynamicSqlSupport.student);
718 
719         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
720                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
721 
722         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
723 
724         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
725                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
726                 .from(StudentDynamicSqlSupport.student);
727 
728         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
729 
730         builder5.limit(3);
731 
732         String expected = "select student.id, student.name, student.idcard"
733                 + " from student"
734                 + " join student_reg on student.id = student_reg.studentId"
735                 + " where student.idcard = #{parameters.p1}"
736                 + " union"
737                 + " select id, name, idcard"
738                 + " from student"
739                 + " order by id"
740                 + " limit #{parameters.p2}";
741 
742         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
743 
744         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
745     }
746 
747     @Test
748     void testFromJoinWhereUnionOrderByLimitB5() {
749         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
750                 .from(StudentDynamicSqlSupport.student);
751 
752         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
753                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
754 
755         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
756 
757         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
758                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
759                 .from(StudentDynamicSqlSupport.student);
760 
761         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
762 
763         builder5.limit(3);
764 
765         String expected = "select student.id, student.name, student.idcard"
766                 + " from student"
767                 + " join student_reg on student.id = student_reg.studentId"
768                 + " where student.idcard = #{parameters.p1}"
769                 + " union"
770                 + " select id, name, idcard"
771                 + " from student"
772                 + " order by id"
773                 + " limit #{parameters.p2}";
774 
775         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
776 
777         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
778     }
779 
780     @Test
781     void testFromJoinWhereUnionOrderByLimitB6() {
782         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
783                 .from(StudentDynamicSqlSupport.student);
784 
785         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
786                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
787 
788         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
789 
790         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
791                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
792                 .from(StudentDynamicSqlSupport.student);
793 
794         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
795 
796         var builder6 = builder5.limit(3);
797 
798         String expected = "select student.id, student.name, student.idcard"
799                 + " from student"
800                 + " join student_reg on student.id = student_reg.studentId"
801                 + " where student.idcard = #{parameters.p1}"
802                 + " union"
803                 + " select id, name, idcard"
804                 + " from student"
805                 + " order by id"
806                 + " limit #{parameters.p2}";
807 
808         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
809 
810         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
811     }
812 
813     @Test
814     void testFromJoinWhereUnionOrderByLimitOffsetB1() {
815         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
816                 .from(StudentDynamicSqlSupport.student);
817 
818         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
819                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
820 
821         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
822 
823         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
824                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
825                 .from(StudentDynamicSqlSupport.student);
826 
827         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
828 
829         var builder6 = builder5.limit(3);
830 
831         builder6.offset(2);
832 
833         String expected = "select student.id, student.name, student.idcard"
834                 + " from student"
835                 + " join student_reg on student.id = student_reg.studentId"
836                 + " where student.idcard = #{parameters.p1}"
837                 + " union"
838                 + " select id, name, idcard"
839                 + " from student"
840                 + " order by id"
841                 + " limit #{parameters.p2}"
842                 + " offset #{parameters.p3}";
843 
844         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
845 
846         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
847     }
848 
849     @Test
850     void testFromJoinWhereUnionOrderByLimitOffsetB2() {
851         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
852                 .from(StudentDynamicSqlSupport.student);
853 
854         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
855                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
856 
857         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
858 
859         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
860                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
861                 .from(StudentDynamicSqlSupport.student);
862 
863         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
864 
865         var builder6 = builder5.limit(3);
866 
867         builder6.offset(2);
868 
869         String expected = "select student.id, student.name, student.idcard"
870                 + " from student"
871                 + " join student_reg on student.id = student_reg.studentId"
872                 + " where student.idcard = #{parameters.p1}"
873                 + " union"
874                 + " select id, name, idcard"
875                 + " from student"
876                 + " order by id"
877                 + " limit #{parameters.p2}"
878                 + " offset #{parameters.p3}";
879 
880         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
881 
882         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
883     }
884 
885     @Test
886     void testFromJoinWhereUnionOrderByLimitOffsetB3() {
887         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
888                 .from(StudentDynamicSqlSupport.student);
889 
890         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
891                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
892 
893         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
894 
895         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
896                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
897                 .from(StudentDynamicSqlSupport.student);
898 
899         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
900 
901         var builder6 = builder5.limit(3);
902 
903         builder6.offset(2);
904 
905         String expected = "select student.id, student.name, student.idcard"
906                 + " from student"
907                 + " join student_reg on student.id = student_reg.studentId"
908                 + " where student.idcard = #{parameters.p1}"
909                 + " union"
910                 + " select id, name, idcard"
911                 + " from student"
912                 + " order by id"
913                 + " limit #{parameters.p2}"
914                 + " offset #{parameters.p3}";
915 
916         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
917 
918         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
919     }
920 
921     @Test
922     void testFromJoinWhereUnionOrderByLimitOffsetB4() {
923         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
924                 .from(StudentDynamicSqlSupport.student);
925 
926         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
927                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
928 
929         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
930 
931         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
932                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
933                 .from(StudentDynamicSqlSupport.student);
934 
935         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
936 
937         var builder6 = builder5.limit(3);
938 
939         builder6.offset(2);
940 
941         String expected = "select student.id, student.name, student.idcard"
942                 + " from student"
943                 + " join student_reg on student.id = student_reg.studentId"
944                 + " where student.idcard = #{parameters.p1}"
945                 + " union"
946                 + " select id, name, idcard"
947                 + " from student"
948                 + " order by id"
949                 + " limit #{parameters.p2}"
950                 + " offset #{parameters.p3}";
951 
952         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
953 
954         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
955     }
956 
957     @Test
958     void testFromJoinWhereUnionOrderByLimitOffsetB5() {
959         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
960                 .from(StudentDynamicSqlSupport.student);
961 
962         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
963                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
964 
965         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
966 
967         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
968                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
969                 .from(StudentDynamicSqlSupport.student);
970 
971         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
972 
973         var builder6 = builder5.limit(3);
974 
975         builder6.offset(2);
976 
977         String expected = "select student.id, student.name, student.idcard"
978                 + " from student"
979                 + " join student_reg on student.id = student_reg.studentId"
980                 + " where student.idcard = #{parameters.p1}"
981                 + " union"
982                 + " select id, name, idcard"
983                 + " from student"
984                 + " order by id"
985                 + " limit #{parameters.p2}"
986                 + " offset #{parameters.p3}";
987 
988         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
989 
990         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
991     }
992 
993     @Test
994     void testFromJoinWhereUnionOrderByLimitOffsetB6() {
995         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
996                 .from(StudentDynamicSqlSupport.student);
997 
998         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
999                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1000 
1001         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1002 
1003         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1004                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1005                 .from(StudentDynamicSqlSupport.student);
1006 
1007         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1008 
1009         var builder6 = builder5.limit(3);
1010 
1011         builder6.offset(2);
1012 
1013         String expected = "select student.id, student.name, student.idcard"
1014                 + " from student"
1015                 + " join student_reg on student.id = student_reg.studentId"
1016                 + " where student.idcard = #{parameters.p1}"
1017                 + " union"
1018                 + " select id, name, idcard"
1019                 + " from student"
1020                 + " order by id"
1021                 + " limit #{parameters.p2}"
1022                 + " offset #{parameters.p3}";
1023 
1024         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
1025 
1026         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1027     }
1028 
1029     @Test
1030     void testFromJoinWhereUnionOrderByLimitOffsetB7() {
1031         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1032                 .from(StudentDynamicSqlSupport.student);
1033 
1034         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1035                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1036 
1037         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1038 
1039         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1040                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1041                 .from(StudentDynamicSqlSupport.student);
1042 
1043         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1044 
1045         var builder6 = builder5.limit(3);
1046 
1047         var builder7 = builder6.offset(2);
1048 
1049         String expected = "select student.id, student.name, student.idcard"
1050                 + " from student"
1051                 + " join student_reg on student.id = student_reg.studentId"
1052                 + " where student.idcard = #{parameters.p1}"
1053                 + " union"
1054                 + " select id, name, idcard"
1055                 + " from student"
1056                 + " order by id"
1057                 + " limit #{parameters.p2}"
1058                 + " offset #{parameters.p3}";
1059 
1060         SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategies.MYBATIS3);
1061 
1062         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1063     }
1064 
1065     @Test
1066     void testFromJoinWhereUnionOrderByOffsetB1() {
1067         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1068                 .from(StudentDynamicSqlSupport.student);
1069 
1070         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1071                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1072 
1073         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1074 
1075         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1076                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1077                 .from(StudentDynamicSqlSupport.student);
1078 
1079         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1080 
1081         builder5.offset(2);
1082 
1083         String expected = "select student.id, student.name, student.idcard"
1084                 + " from student"
1085                 + " join student_reg on student.id = student_reg.studentId"
1086                 + " where student.idcard = #{parameters.p1}"
1087                 + " union"
1088                 + " select id, name, idcard"
1089                 + " from student"
1090                 + " order by id"
1091                 + " offset #{parameters.p2} rows";
1092 
1093         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
1094 
1095         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1096 
1097     }
1098 
1099     @Test
1100     void testFromJoinWhereUnionOrderByOffsetB2() {
1101         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1102                 .from(StudentDynamicSqlSupport.student);
1103 
1104         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1105                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1106 
1107         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1108 
1109         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1110                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1111                 .from(StudentDynamicSqlSupport.student);
1112 
1113         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1114 
1115         builder5.offset(2);
1116 
1117         String expected = "select student.id, student.name, student.idcard"
1118                 + " from student"
1119                 + " join student_reg on student.id = student_reg.studentId"
1120                 + " where student.idcard = #{parameters.p1}"
1121                 + " union"
1122                 + " select id, name, idcard"
1123                 + " from student"
1124                 + " order by id"
1125                 + " offset #{parameters.p2} rows";
1126 
1127         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
1128 
1129         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1130 
1131     }
1132 
1133     @Test
1134     void testFromJoinWhereUnionOrderByOffsetB3() {
1135         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1136                 .from(StudentDynamicSqlSupport.student);
1137 
1138         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1139                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1140 
1141         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1142 
1143         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1144                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1145                 .from(StudentDynamicSqlSupport.student);
1146 
1147         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1148 
1149         builder5.offset(2);
1150 
1151         String expected = "select student.id, student.name, student.idcard"
1152                 + " from student"
1153                 + " join student_reg on student.id = student_reg.studentId"
1154                 + " where student.idcard = #{parameters.p1}"
1155                 + " union"
1156                 + " select id, name, idcard"
1157                 + " from student"
1158                 + " order by id"
1159                 + " offset #{parameters.p2} rows";
1160 
1161         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
1162 
1163         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1164 
1165     }
1166 
1167     @Test
1168     void testFromJoinWhereUnionOrderByOffsetB4() {
1169         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1170                 .from(StudentDynamicSqlSupport.student);
1171 
1172         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1173                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1174 
1175         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1176 
1177         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1178                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1179                 .from(StudentDynamicSqlSupport.student);
1180 
1181         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1182 
1183         builder5.offset(2);
1184 
1185         String expected = "select student.id, student.name, student.idcard"
1186                 + " from student"
1187                 + " join student_reg on student.id = student_reg.studentId"
1188                 + " where student.idcard = #{parameters.p1}"
1189                 + " union"
1190                 + " select id, name, idcard"
1191                 + " from student"
1192                 + " order by id"
1193                 + " offset #{parameters.p2} rows";
1194 
1195         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
1196 
1197         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1198 
1199     }
1200 
1201     @Test
1202     void testFromJoinWhereUnionOrderByOffsetB5() {
1203         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1204                 .from(StudentDynamicSqlSupport.student);
1205 
1206         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1207                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1208 
1209         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1210 
1211         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1212                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1213                 .from(StudentDynamicSqlSupport.student);
1214 
1215         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1216 
1217         builder5.offset(2);
1218 
1219         String expected = "select student.id, student.name, student.idcard"
1220                 + " from student"
1221                 + " join student_reg on student.id = student_reg.studentId"
1222                 + " where student.idcard = #{parameters.p1}"
1223                 + " union"
1224                 + " select id, name, idcard"
1225                 + " from student"
1226                 + " order by id"
1227                 + " offset #{parameters.p2} rows";
1228 
1229         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
1230 
1231         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1232 
1233     }
1234 
1235     @Test
1236     void testFromJoinWhereUnionOrderByOffsetB6() {
1237         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1238                 .from(StudentDynamicSqlSupport.student);
1239 
1240         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1241                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1242 
1243         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1244 
1245         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1246                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1247                 .from(StudentDynamicSqlSupport.student);
1248 
1249         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1250 
1251         var builder6 = builder5.offset(2);
1252 
1253         String expected = "select student.id, student.name, student.idcard"
1254                 + " from student"
1255                 + " join student_reg on student.id = student_reg.studentId"
1256                 + " where student.idcard = #{parameters.p1}"
1257                 + " union"
1258                 + " select id, name, idcard"
1259                 + " from student"
1260                 + " order by id"
1261                 + " offset #{parameters.p2} rows";
1262 
1263         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
1264 
1265         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1266 
1267     }
1268 
1269     @Test
1270     void testFromJoinWhereUnionOrderByOffsetFetchFirstB1() {
1271         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1272                 .from(StudentDynamicSqlSupport.student);
1273 
1274         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1275                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1276 
1277         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1278 
1279         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1280                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1281                 .from(StudentDynamicSqlSupport.student);
1282 
1283         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1284 
1285         var builder6 = builder5.offset(2);
1286 
1287         builder6.fetchFirst(3).rowsOnly();
1288 
1289         String expected = "select student.id, student.name, student.idcard"
1290                 + " from student"
1291                 + " join student_reg on student.id = student_reg.studentId"
1292                 + " where student.idcard = #{parameters.p1}"
1293                 + " union"
1294                 + " select id, name, idcard"
1295                 + " from student"
1296                 + " order by id"
1297                 + " offset #{parameters.p2} rows"
1298                 + " fetch first #{parameters.p3} rows only";
1299 
1300         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
1301 
1302         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1303     }
1304 
1305     @Test
1306     void testFromJoinWhereUnionOrderByOffsetFetchFirstB2() {
1307         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1308                 .from(StudentDynamicSqlSupport.student);
1309 
1310         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1311                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1312 
1313         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1314 
1315         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1316                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1317                 .from(StudentDynamicSqlSupport.student);
1318 
1319         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1320 
1321         var builder6 = builder5.offset(2);
1322 
1323         builder6.fetchFirst(3).rowsOnly();
1324 
1325         String expected = "select student.id, student.name, student.idcard"
1326                 + " from student"
1327                 + " join student_reg on student.id = student_reg.studentId"
1328                 + " where student.idcard = #{parameters.p1}"
1329                 + " union"
1330                 + " select id, name, idcard"
1331                 + " from student"
1332                 + " order by id"
1333                 + " offset #{parameters.p2} rows"
1334                 + " fetch first #{parameters.p3} rows only";
1335 
1336         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
1337 
1338         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1339     }
1340 
1341     @Test
1342     void testFromJoinWhereUnionOrderByOffsetFetchFirstB3() {
1343         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1344                 .from(StudentDynamicSqlSupport.student);
1345 
1346         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1347                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1348 
1349         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1350 
1351         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1352                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1353                 .from(StudentDynamicSqlSupport.student);
1354 
1355         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1356 
1357         var builder6 = builder5.offset(2);
1358 
1359         builder6.fetchFirst(3).rowsOnly();
1360 
1361         String expected = "select student.id, student.name, student.idcard"
1362                 + " from student"
1363                 + " join student_reg on student.id = student_reg.studentId"
1364                 + " where student.idcard = #{parameters.p1}"
1365                 + " union"
1366                 + " select id, name, idcard"
1367                 + " from student"
1368                 + " order by id"
1369                 + " offset #{parameters.p2} rows"
1370                 + " fetch first #{parameters.p3} rows only";
1371 
1372         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
1373 
1374         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1375     }
1376 
1377     @Test
1378     void testFromJoinWhereUnionOrderByOffsetFetchFirstB4() {
1379         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1380                 .from(StudentDynamicSqlSupport.student);
1381 
1382         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1383                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1384 
1385         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1386 
1387         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1388                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1389                 .from(StudentDynamicSqlSupport.student);
1390 
1391         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1392 
1393         var builder6 = builder5.offset(2);
1394 
1395         builder6.fetchFirst(3).rowsOnly();
1396 
1397         String expected = "select student.id, student.name, student.idcard"
1398                 + " from student"
1399                 + " join student_reg on student.id = student_reg.studentId"
1400                 + " where student.idcard = #{parameters.p1}"
1401                 + " union"
1402                 + " select id, name, idcard"
1403                 + " from student"
1404                 + " order by id"
1405                 + " offset #{parameters.p2} rows"
1406                 + " fetch first #{parameters.p3} rows only";
1407 
1408         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
1409 
1410         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1411     }
1412 
1413     @Test
1414     void testFromJoinWhereUnionOrderByOffsetFetchFirstB5() {
1415         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1416                 .from(StudentDynamicSqlSupport.student);
1417 
1418         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1419                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1420 
1421         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1422 
1423         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1424                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1425                 .from(StudentDynamicSqlSupport.student);
1426 
1427         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1428 
1429         var builder6 = builder5.offset(2);
1430 
1431         builder6.fetchFirst(3).rowsOnly();
1432 
1433         String expected = "select student.id, student.name, student.idcard"
1434                 + " from student"
1435                 + " join student_reg on student.id = student_reg.studentId"
1436                 + " where student.idcard = #{parameters.p1}"
1437                 + " union"
1438                 + " select id, name, idcard"
1439                 + " from student"
1440                 + " order by id"
1441                 + " offset #{parameters.p2} rows"
1442                 + " fetch first #{parameters.p3} rows only";
1443 
1444         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
1445 
1446         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1447     }
1448 
1449     @Test
1450     void testFromJoinWhereUnionOrderByOffsetFetchFirstB6() {
1451         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1452                 .from(StudentDynamicSqlSupport.student);
1453 
1454         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1455                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1456 
1457         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1458 
1459         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1460                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1461                 .from(StudentDynamicSqlSupport.student);
1462 
1463         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1464 
1465         var builder6 = builder5.offset(2);
1466 
1467         builder6.fetchFirst(3).rowsOnly();
1468 
1469         String expected = "select student.id, student.name, student.idcard"
1470                 + " from student"
1471                 + " join student_reg on student.id = student_reg.studentId"
1472                 + " where student.idcard = #{parameters.p1}"
1473                 + " union"
1474                 + " select id, name, idcard"
1475                 + " from student"
1476                 + " order by id"
1477                 + " offset #{parameters.p2} rows"
1478                 + " fetch first #{parameters.p3} rows only";
1479 
1480         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
1481 
1482         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1483     }
1484 
1485     @Test
1486     void testFromJoinWhereUnionOrderByOffsetFetchFirstB7() {
1487         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1488                 .from(StudentDynamicSqlSupport.student);
1489 
1490         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1491                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1492 
1493         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1494 
1495         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1496                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1497                 .from(StudentDynamicSqlSupport.student);
1498 
1499         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1500 
1501         var builder6 = builder5.offset(2);
1502 
1503         var builder7 = builder6.fetchFirst(3).rowsOnly();
1504 
1505         String expected = "select student.id, student.name, student.idcard"
1506                 + " from student"
1507                 + " join student_reg on student.id = student_reg.studentId"
1508                 + " where student.idcard = #{parameters.p1}"
1509                 + " union"
1510                 + " select id, name, idcard"
1511                 + " from student"
1512                 + " order by id"
1513                 + " offset #{parameters.p2} rows"
1514                 + " fetch first #{parameters.p3} rows only";
1515 
1516         SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategies.MYBATIS3);
1517 
1518         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1519     }
1520 
1521     @Test
1522     void testFromJoinWhereUnionOrderByFetchFirstB1() {
1523         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1524                 .from(StudentDynamicSqlSupport.student);
1525 
1526         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1527                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1528 
1529         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1530 
1531         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1532                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1533                 .from(StudentDynamicSqlSupport.student);
1534 
1535         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1536 
1537         builder5.fetchFirst(3).rowsOnly();
1538 
1539         String expected = "select student.id, student.name, student.idcard"
1540                 + " from student"
1541                 + " join student_reg on student.id = student_reg.studentId"
1542                 + " where student.idcard = #{parameters.p1}"
1543                 + " union"
1544                 + " select id, name, idcard"
1545                 + " from student"
1546                 + " order by id"
1547                 + " fetch first #{parameters.p2} rows only";
1548 
1549         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
1550 
1551         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1552     }
1553 
1554     @Test
1555     void testFromJoinWhereUnionOrderByFetchFirstB2() {
1556         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1557                 .from(StudentDynamicSqlSupport.student);
1558 
1559         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1560                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1561 
1562         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1563 
1564         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1565                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1566                 .from(StudentDynamicSqlSupport.student);
1567 
1568         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1569 
1570         builder5.fetchFirst(3).rowsOnly();
1571 
1572         String expected = "select student.id, student.name, student.idcard"
1573                 + " from student"
1574                 + " join student_reg on student.id = student_reg.studentId"
1575                 + " where student.idcard = #{parameters.p1}"
1576                 + " union"
1577                 + " select id, name, idcard"
1578                 + " from student"
1579                 + " order by id"
1580                 + " fetch first #{parameters.p2} rows only";
1581 
1582         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
1583 
1584         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1585     }
1586 
1587     @Test
1588     void testFromJoinWhereUnionOrderByFetchFirstB3() {
1589         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1590                 .from(StudentDynamicSqlSupport.student);
1591 
1592         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1593                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1594 
1595         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1596 
1597         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1598                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1599                 .from(StudentDynamicSqlSupport.student);
1600 
1601         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1602 
1603         builder5.fetchFirst(3).rowsOnly();
1604 
1605         String expected = "select student.id, student.name, student.idcard"
1606                 + " from student"
1607                 + " join student_reg on student.id = student_reg.studentId"
1608                 + " where student.idcard = #{parameters.p1}"
1609                 + " union"
1610                 + " select id, name, idcard"
1611                 + " from student"
1612                 + " order by id"
1613                 + " fetch first #{parameters.p2} rows only";
1614 
1615         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
1616 
1617         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1618     }
1619 
1620     @Test
1621     void testFromJoinWhereUnionOrderByFetchFirstB4() {
1622         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1623                 .from(StudentDynamicSqlSupport.student);
1624 
1625         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1626                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1627 
1628         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1629 
1630         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1631                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1632                 .from(StudentDynamicSqlSupport.student);
1633 
1634         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1635 
1636         builder5.fetchFirst(3).rowsOnly();
1637 
1638         String expected = "select student.id, student.name, student.idcard"
1639                 + " from student"
1640                 + " join student_reg on student.id = student_reg.studentId"
1641                 + " where student.idcard = #{parameters.p1}"
1642                 + " union"
1643                 + " select id, name, idcard"
1644                 + " from student"
1645                 + " order by id"
1646                 + " fetch first #{parameters.p2} rows only";
1647 
1648         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
1649 
1650         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1651     }
1652 
1653     @Test
1654     void testFromJoinWhereUnionOrderByFetchFirstB5() {
1655         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1656                 .from(StudentDynamicSqlSupport.student);
1657 
1658         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1659                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1660 
1661         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1662 
1663         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1664                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1665                 .from(StudentDynamicSqlSupport.student);
1666 
1667         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1668 
1669         builder5.fetchFirst(3).rowsOnly();
1670 
1671         String expected = "select student.id, student.name, student.idcard"
1672                 + " from student"
1673                 + " join student_reg on student.id = student_reg.studentId"
1674                 + " where student.idcard = #{parameters.p1}"
1675                 + " union"
1676                 + " select id, name, idcard"
1677                 + " from student"
1678                 + " order by id"
1679                 + " fetch first #{parameters.p2} rows only";
1680 
1681         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
1682 
1683         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1684     }
1685 
1686     @Test
1687     void testFromJoinWhereUnionOrderByFetchFirstB6() {
1688         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1689                 .from(StudentDynamicSqlSupport.student);
1690 
1691         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1692                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1693 
1694         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1695 
1696         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1697                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1698                 .from(StudentDynamicSqlSupport.student);
1699 
1700         SelectDSL<SelectModel> builder5 = builder4.orderBy(StudentDynamicSqlSupport.id);
1701 
1702         var builder6 = builder5.fetchFirst(3).rowsOnly();
1703 
1704         String expected = "select student.id, student.name, student.idcard"
1705                 + " from student"
1706                 + " join student_reg on student.id = student_reg.studentId"
1707                 + " where student.idcard = #{parameters.p1}"
1708                 + " union"
1709                 + " select id, name, idcard"
1710                 + " from student"
1711                 + " order by id"
1712                 + " fetch first #{parameters.p2} rows only";
1713 
1714         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
1715 
1716         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1717     }
1718 
1719     @Test
1720     void testFromJoinWhereUnionLimitB1() {
1721         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1722                 .from(StudentDynamicSqlSupport.student);
1723 
1724         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1725                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1726 
1727         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1728 
1729         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1730                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1731                 .from(StudentDynamicSqlSupport.student);
1732 
1733         builder4.limit(3);
1734 
1735         String expected = "select student.id, student.name, student.idcard"
1736                 + " from student"
1737                 + " join student_reg on student.id = student_reg.studentId"
1738                 + " where student.idcard = #{parameters.p1}"
1739                 + " union"
1740                 + " select id, name, idcard"
1741                 + " from student"
1742                 + " limit #{parameters.p2}";
1743 
1744         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
1745 
1746         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1747     }
1748 
1749     @Test
1750     void testFromJoinWhereUnionLimitB2() {
1751         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1752                 .from(StudentDynamicSqlSupport.student);
1753 
1754         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1755                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1756 
1757         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1758 
1759         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1760                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1761                 .from(StudentDynamicSqlSupport.student);
1762 
1763         builder4.limit(3);
1764 
1765         String expected = "select student.id, student.name, student.idcard"
1766                 + " from student"
1767                 + " join student_reg on student.id = student_reg.studentId"
1768                 + " where student.idcard = #{parameters.p1}"
1769                 + " union"
1770                 + " select id, name, idcard"
1771                 + " from student"
1772                 + " limit #{parameters.p2}";
1773 
1774         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
1775 
1776         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1777     }
1778 
1779     @Test
1780     void testFromJoinWhereUnionLimitB3() {
1781         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1782                 .from(StudentDynamicSqlSupport.student);
1783 
1784         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1785                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1786 
1787         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1788 
1789         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1790                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1791                 .from(StudentDynamicSqlSupport.student);
1792 
1793         builder4.limit(3);
1794 
1795         String expected = "select student.id, student.name, student.idcard"
1796                 + " from student"
1797                 + " join student_reg on student.id = student_reg.studentId"
1798                 + " where student.idcard = #{parameters.p1}"
1799                 + " union"
1800                 + " select id, name, idcard"
1801                 + " from student"
1802                 + " limit #{parameters.p2}";
1803 
1804         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
1805 
1806         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1807     }
1808 
1809     @Test
1810     void testFromJoinWhereUnionLimitB4() {
1811         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1812                 .from(StudentDynamicSqlSupport.student);
1813 
1814         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1815                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1816 
1817         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1818 
1819         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1820                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1821                 .from(StudentDynamicSqlSupport.student);
1822 
1823         builder4.limit(3);
1824 
1825         String expected = "select student.id, student.name, student.idcard"
1826                 + " from student"
1827                 + " join student_reg on student.id = student_reg.studentId"
1828                 + " where student.idcard = #{parameters.p1}"
1829                 + " union"
1830                 + " select id, name, idcard"
1831                 + " from student"
1832                 + " limit #{parameters.p2}";
1833 
1834         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
1835 
1836         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1837     }
1838 
1839     @Test
1840     void testFromJoinWhereUnionLimitB5() {
1841         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1842                 .from(StudentDynamicSqlSupport.student);
1843 
1844         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1845                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1846 
1847         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1848 
1849         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1850                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1851                 .from(StudentDynamicSqlSupport.student);
1852 
1853         var builder5 = builder4.limit(3);
1854 
1855         String expected = "select student.id, student.name, student.idcard"
1856                 + " from student"
1857                 + " join student_reg on student.id = student_reg.studentId"
1858                 + " where student.idcard = #{parameters.p1}"
1859                 + " union"
1860                 + " select id, name, idcard"
1861                 + " from student"
1862                 + " limit #{parameters.p2}";
1863 
1864         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
1865 
1866         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1867     }
1868 
1869     @Test
1870     void testFromJoinWhereUnionLimitOffsetB1() {
1871         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1872                 .from(StudentDynamicSqlSupport.student);
1873 
1874         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1875                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1876 
1877         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1878 
1879         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1880                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1881                 .from(StudentDynamicSqlSupport.student);
1882 
1883         var builder5 = builder4.limit(3);
1884 
1885         builder5.offset(2);
1886 
1887         String expected = "select student.id, student.name, student.idcard"
1888                 + " from student"
1889                 + " join student_reg on student.id = student_reg.studentId"
1890                 + " where student.idcard = #{parameters.p1}"
1891                 + " union"
1892                 + " select id, name, idcard"
1893                 + " from student"
1894                 + " limit #{parameters.p2}"
1895                 + " offset #{parameters.p3}";
1896 
1897         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
1898 
1899         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1900     }
1901 
1902     @Test
1903     void testFromJoinWhereUnionLimitOffsetB2() {
1904         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1905                 .from(StudentDynamicSqlSupport.student);
1906 
1907         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1908                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1909 
1910         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1911 
1912         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1913                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1914                 .from(StudentDynamicSqlSupport.student);
1915 
1916         var builder5 = builder4.limit(3);
1917 
1918         builder5.offset(2);
1919 
1920         String expected = "select student.id, student.name, student.idcard"
1921                 + " from student"
1922                 + " join student_reg on student.id = student_reg.studentId"
1923                 + " where student.idcard = #{parameters.p1}"
1924                 + " union"
1925                 + " select id, name, idcard"
1926                 + " from student"
1927                 + " limit #{parameters.p2}"
1928                 + " offset #{parameters.p3}";
1929 
1930         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
1931 
1932         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1933     }
1934 
1935     @Test
1936     void testFromJoinWhereUnionLimitOffsetB3() {
1937         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1938                 .from(StudentDynamicSqlSupport.student);
1939 
1940         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1941                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1942 
1943         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1944 
1945         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1946                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1947                 .from(StudentDynamicSqlSupport.student);
1948 
1949         var builder5 = builder4.limit(3);
1950 
1951         builder5.offset(2);
1952 
1953         String expected = "select student.id, student.name, student.idcard"
1954                 + " from student"
1955                 + " join student_reg on student.id = student_reg.studentId"
1956                 + " where student.idcard = #{parameters.p1}"
1957                 + " union"
1958                 + " select id, name, idcard"
1959                 + " from student"
1960                 + " limit #{parameters.p2}"
1961                 + " offset #{parameters.p3}";
1962 
1963         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
1964 
1965         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1966     }
1967 
1968     @Test
1969     void testFromJoinWhereUnionLimitOffsetB4() {
1970         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1971                 .from(StudentDynamicSqlSupport.student);
1972 
1973         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
1974                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
1975 
1976         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
1977 
1978         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
1979                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
1980                 .from(StudentDynamicSqlSupport.student);
1981 
1982         var builder5 = builder4.limit(3);
1983 
1984         builder5.offset(2);
1985 
1986         String expected = "select student.id, student.name, student.idcard"
1987                 + " from student"
1988                 + " join student_reg on student.id = student_reg.studentId"
1989                 + " where student.idcard = #{parameters.p1}"
1990                 + " union"
1991                 + " select id, name, idcard"
1992                 + " from student"
1993                 + " limit #{parameters.p2}"
1994                 + " offset #{parameters.p3}";
1995 
1996         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
1997 
1998         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
1999     }
2000 
2001     @Test
2002     void testFromJoinWhereUnionLimitOffsetB5() {
2003         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2004                 .from(StudentDynamicSqlSupport.student);
2005 
2006         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2007                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2008 
2009         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2010 
2011         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2012                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2013                 .from(StudentDynamicSqlSupport.student);
2014 
2015         var builder5 = builder4.limit(3);
2016 
2017         builder5.offset(2);
2018 
2019         String expected = "select student.id, student.name, student.idcard"
2020                 + " from student"
2021                 + " join student_reg on student.id = student_reg.studentId"
2022                 + " where student.idcard = #{parameters.p1}"
2023                 + " union"
2024                 + " select id, name, idcard"
2025                 + " from student"
2026                 + " limit #{parameters.p2}"
2027                 + " offset #{parameters.p3}";
2028 
2029         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
2030 
2031         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2032     }
2033 
2034     @Test
2035     void testFromJoinWhereUnionLimitOffsetB6() {
2036         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2037                 .from(StudentDynamicSqlSupport.student);
2038 
2039         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2040                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2041 
2042         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2043 
2044         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2045                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2046                 .from(StudentDynamicSqlSupport.student);
2047 
2048         var builder5 = builder4.limit(3);
2049 
2050         var builder6 = builder5.offset(2);
2051 
2052         String expected = "select student.id, student.name, student.idcard"
2053                 + " from student"
2054                 + " join student_reg on student.id = student_reg.studentId"
2055                 + " where student.idcard = #{parameters.p1}"
2056                 + " union"
2057                 + " select id, name, idcard"
2058                 + " from student"
2059                 + " limit #{parameters.p2}"
2060                 + " offset #{parameters.p3}";
2061 
2062         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
2063 
2064         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2065     }
2066 
2067     @Test
2068     void testFromJoinWhereUnionOffsetB1() {
2069         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2070                 .from(StudentDynamicSqlSupport.student);
2071 
2072         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2073                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2074 
2075         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2076 
2077         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2078                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2079                 .from(StudentDynamicSqlSupport.student);
2080 
2081         builder4.offset(2);
2082 
2083         String expected = "select student.id, student.name, student.idcard"
2084                 + " from student"
2085                 + " join student_reg on student.id = student_reg.studentId"
2086                 + " where student.idcard = #{parameters.p1}"
2087                 + " union"
2088                 + " select id, name, idcard"
2089                 + " from student"
2090                 + " offset #{parameters.p2} rows";
2091 
2092         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
2093 
2094         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2095     }
2096 
2097     @Test
2098     void testFromJoinWhereUnionOffsetB2() {
2099         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2100                 .from(StudentDynamicSqlSupport.student);
2101 
2102         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2103                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2104 
2105         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2106 
2107         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2108                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2109                 .from(StudentDynamicSqlSupport.student);
2110 
2111         builder4.offset(2);
2112 
2113         String expected = "select student.id, student.name, student.idcard"
2114                 + " from student"
2115                 + " join student_reg on student.id = student_reg.studentId"
2116                 + " where student.idcard = #{parameters.p1}"
2117                 + " union"
2118                 + " select id, name, idcard"
2119                 + " from student"
2120                 + " offset #{parameters.p2} rows";
2121 
2122         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
2123 
2124         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2125     }
2126 
2127     @Test
2128     void testFromJoinWhereUnionOffsetB3() {
2129         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2130                 .from(StudentDynamicSqlSupport.student);
2131 
2132         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2133                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2134 
2135         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2136 
2137         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2138                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2139                 .from(StudentDynamicSqlSupport.student);
2140 
2141         builder4.offset(2);
2142 
2143         String expected = "select student.id, student.name, student.idcard"
2144                 + " from student"
2145                 + " join student_reg on student.id = student_reg.studentId"
2146                 + " where student.idcard = #{parameters.p1}"
2147                 + " union"
2148                 + " select id, name, idcard"
2149                 + " from student"
2150                 + " offset #{parameters.p2} rows";
2151 
2152         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
2153 
2154         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2155     }
2156 
2157     @Test
2158     void testFromJoinWhereUnionOffsetB4() {
2159         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2160                 .from(StudentDynamicSqlSupport.student);
2161 
2162         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2163                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2164 
2165         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2166 
2167         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2168                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2169                 .from(StudentDynamicSqlSupport.student);
2170 
2171         builder4.offset(2);
2172 
2173         String expected = "select student.id, student.name, student.idcard"
2174                 + " from student"
2175                 + " join student_reg on student.id = student_reg.studentId"
2176                 + " where student.idcard = #{parameters.p1}"
2177                 + " union"
2178                 + " select id, name, idcard"
2179                 + " from student"
2180                 + " offset #{parameters.p2} rows";
2181 
2182         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
2183 
2184         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2185     }
2186 
2187     @Test
2188     void testFromJoinWhereUnionOffsetB5() {
2189         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2190                 .from(StudentDynamicSqlSupport.student);
2191 
2192         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2193                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2194 
2195         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2196 
2197         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2198                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2199                 .from(StudentDynamicSqlSupport.student);
2200 
2201         var builder5 = builder4.offset(2);
2202 
2203         String expected = "select student.id, student.name, student.idcard"
2204                 + " from student"
2205                 + " join student_reg on student.id = student_reg.studentId"
2206                 + " where student.idcard = #{parameters.p1}"
2207                 + " union"
2208                 + " select id, name, idcard"
2209                 + " from student"
2210                 + " offset #{parameters.p2} rows";
2211 
2212         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
2213 
2214         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2215     }
2216 
2217     @Test
2218     void testFromJoinWhereUnionOffsetFetchFirstB1() {
2219         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2220                 .from(StudentDynamicSqlSupport.student);
2221 
2222         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2223                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2224 
2225         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2226 
2227         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2228                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2229                 .from(StudentDynamicSqlSupport.student);
2230 
2231         var builder5 = builder4.offset(2);
2232 
2233         builder5.fetchFirst(2).rowsOnly();
2234 
2235         String expected = "select student.id, student.name, student.idcard"
2236                 + " from student"
2237                 + " join student_reg on student.id = student_reg.studentId"
2238                 + " where student.idcard = #{parameters.p1}"
2239                 + " union"
2240                 + " select id, name, idcard"
2241                 + " from student"
2242                 + " offset #{parameters.p2} rows"
2243                 + " fetch first #{parameters.p3} rows only";
2244 
2245         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
2246 
2247         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2248     }
2249 
2250     @Test
2251     void testFromJoinWhereUnionOffsetFetchFirstB2() {
2252         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2253                 .from(StudentDynamicSqlSupport.student);
2254 
2255         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2256                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2257 
2258         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2259 
2260         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2261                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2262                 .from(StudentDynamicSqlSupport.student);
2263 
2264         var builder5 = builder4.offset(2);
2265 
2266         builder5.fetchFirst(2).rowsOnly();
2267 
2268         String expected = "select student.id, student.name, student.idcard"
2269                 + " from student"
2270                 + " join student_reg on student.id = student_reg.studentId"
2271                 + " where student.idcard = #{parameters.p1}"
2272                 + " union"
2273                 + " select id, name, idcard"
2274                 + " from student"
2275                 + " offset #{parameters.p2} rows"
2276                 + " fetch first #{parameters.p3} rows only";
2277 
2278         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
2279 
2280         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2281     }
2282 
2283     @Test
2284     void testFromJoinWhereUnionOffsetFetchFirstB3() {
2285         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2286                 .from(StudentDynamicSqlSupport.student);
2287 
2288         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2289                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2290 
2291         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2292 
2293         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2294                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2295                 .from(StudentDynamicSqlSupport.student);
2296 
2297         var builder5 = builder4.offset(2);
2298 
2299         builder5.fetchFirst(2).rowsOnly();
2300 
2301         String expected = "select student.id, student.name, student.idcard"
2302                 + " from student"
2303                 + " join student_reg on student.id = student_reg.studentId"
2304                 + " where student.idcard = #{parameters.p1}"
2305                 + " union"
2306                 + " select id, name, idcard"
2307                 + " from student"
2308                 + " offset #{parameters.p2} rows"
2309                 + " fetch first #{parameters.p3} rows only";
2310 
2311         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
2312 
2313         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2314     }
2315 
2316     @Test
2317     void testFromJoinWhereUnionOffsetFetchFirstB4() {
2318         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2319                 .from(StudentDynamicSqlSupport.student);
2320 
2321         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2322                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2323 
2324         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2325 
2326         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2327                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2328                 .from(StudentDynamicSqlSupport.student);
2329 
2330         var builder5 = builder4.offset(2);
2331 
2332         builder5.fetchFirst(2).rowsOnly();
2333 
2334         String expected = "select student.id, student.name, student.idcard"
2335                 + " from student"
2336                 + " join student_reg on student.id = student_reg.studentId"
2337                 + " where student.idcard = #{parameters.p1}"
2338                 + " union"
2339                 + " select id, name, idcard"
2340                 + " from student"
2341                 + " offset #{parameters.p2} rows"
2342                 + " fetch first #{parameters.p3} rows only";
2343 
2344         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
2345 
2346         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2347     }
2348 
2349     @Test
2350     void testFromJoinWhereUnionOffsetFetchFirstB5() {
2351         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2352                 .from(StudentDynamicSqlSupport.student);
2353 
2354         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2355                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2356 
2357         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2358 
2359         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2360                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2361                 .from(StudentDynamicSqlSupport.student);
2362 
2363         var builder5 = builder4.offset(2);
2364 
2365         builder5.fetchFirst(2).rowsOnly();
2366 
2367         String expected = "select student.id, student.name, student.idcard"
2368                 + " from student"
2369                 + " join student_reg on student.id = student_reg.studentId"
2370                 + " where student.idcard = #{parameters.p1}"
2371                 + " union"
2372                 + " select id, name, idcard"
2373                 + " from student"
2374                 + " offset #{parameters.p2} rows"
2375                 + " fetch first #{parameters.p3} rows only";
2376 
2377         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
2378 
2379         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2380     }
2381 
2382     @Test
2383     void testFromJoinWhereUnionOffsetFetchFirstB6() {
2384         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2385                 .from(StudentDynamicSqlSupport.student);
2386 
2387         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2388                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2389 
2390         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2391 
2392         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2393                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2394                 .from(StudentDynamicSqlSupport.student);
2395 
2396         var builder5 = builder4.offset(2);
2397 
2398         var builder6 = builder5.fetchFirst(2).rowsOnly();
2399 
2400         String expected = "select student.id, student.name, student.idcard"
2401                 + " from student"
2402                 + " join student_reg on student.id = student_reg.studentId"
2403                 + " where student.idcard = #{parameters.p1}"
2404                 + " union"
2405                 + " select id, name, idcard"
2406                 + " from student"
2407                 + " offset #{parameters.p2} rows"
2408                 + " fetch first #{parameters.p3} rows only";
2409 
2410         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
2411 
2412         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2413     }
2414 
2415     @Test
2416     void testFromJoinWhereUnionFetchFirstB1() {
2417         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2418                 .from(StudentDynamicSqlSupport.student);
2419 
2420         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2421                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2422 
2423         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2424 
2425         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2426                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2427                 .from(StudentDynamicSqlSupport.student);
2428 
2429         builder4.fetchFirst(2).rowsOnly();
2430 
2431         String expected = "select student.id, student.name, student.idcard"
2432                 + " from student"
2433                 + " join student_reg on student.id = student_reg.studentId"
2434                 + " where student.idcard = #{parameters.p1}"
2435                 + " union"
2436                 + " select id, name, idcard"
2437                 + " from student"
2438                 + " fetch first #{parameters.p2} rows only";
2439 
2440         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
2441 
2442         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2443     }
2444 
2445     @Test
2446     void testFromJoinWhereUnionFetchFirstB2() {
2447         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2448                 .from(StudentDynamicSqlSupport.student);
2449 
2450         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2451                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2452 
2453         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2454 
2455         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2456                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2457                 .from(StudentDynamicSqlSupport.student);
2458 
2459         builder4.fetchFirst(2).rowsOnly();
2460 
2461         String expected = "select student.id, student.name, student.idcard"
2462                 + " from student"
2463                 + " join student_reg on student.id = student_reg.studentId"
2464                 + " where student.idcard = #{parameters.p1}"
2465                 + " union"
2466                 + " select id, name, idcard"
2467                 + " from student"
2468                 + " fetch first #{parameters.p2} rows only";
2469 
2470         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
2471 
2472         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2473     }
2474 
2475     @Test
2476     void testFromJoinWhereUnionFetchFirstB3() {
2477         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2478                 .from(StudentDynamicSqlSupport.student);
2479 
2480         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2481                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2482 
2483         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2484 
2485         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2486                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2487                 .from(StudentDynamicSqlSupport.student);
2488 
2489         builder4.fetchFirst(2).rowsOnly();
2490 
2491         String expected = "select student.id, student.name, student.idcard"
2492                 + " from student"
2493                 + " join student_reg on student.id = student_reg.studentId"
2494                 + " where student.idcard = #{parameters.p1}"
2495                 + " union"
2496                 + " select id, name, idcard"
2497                 + " from student"
2498                 + " fetch first #{parameters.p2} rows only";
2499 
2500         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
2501 
2502         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2503     }
2504 
2505     @Test
2506     void testFromJoinWhereUnionFetchFirstB4() {
2507         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2508                 .from(StudentDynamicSqlSupport.student);
2509 
2510         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2511                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2512 
2513         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2514 
2515         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2516                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2517                 .from(StudentDynamicSqlSupport.student);
2518 
2519         builder4.fetchFirst(2).rowsOnly();
2520 
2521         String expected = "select student.id, student.name, student.idcard"
2522                 + " from student"
2523                 + " join student_reg on student.id = student_reg.studentId"
2524                 + " where student.idcard = #{parameters.p1}"
2525                 + " union"
2526                 + " select id, name, idcard"
2527                 + " from student"
2528                 + " fetch first #{parameters.p2} rows only";
2529 
2530         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
2531 
2532         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2533     }
2534 
2535     @Test
2536     void testFromJoinWhereUnionFetchFirstB5() {
2537         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2538                 .from(StudentDynamicSqlSupport.student);
2539 
2540         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2541                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2542 
2543         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2544 
2545         QueryExpressionDSL<SelectModel> builder4 = builder3.union()
2546                 .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2547                 .from(StudentDynamicSqlSupport.student);
2548 
2549         var builder5 = builder4.fetchFirst(2).rowsOnly();
2550 
2551         String expected = "select student.id, student.name, student.idcard"
2552                 + " from student"
2553                 + " join student_reg on student.id = student_reg.studentId"
2554                 + " where student.idcard = #{parameters.p1}"
2555                 + " union"
2556                 + " select id, name, idcard"
2557                 + " from student"
2558                 + " fetch first #{parameters.p2} rows only";
2559 
2560         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
2561 
2562         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2563     }
2564 
2565     @Test
2566     void testFromJoinWhereOrderByB1() {
2567         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2568                 .from(StudentDynamicSqlSupport.student);
2569 
2570         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2571                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2572 
2573         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2574 
2575         builder3.orderBy(StudentDynamicSqlSupport.id);
2576 
2577         String expected = "select student.id, student.name, student.idcard"
2578                 + " from student"
2579                 + " join student_reg on student.id = student_reg.studentId"
2580                 + " where student.idcard = #{parameters.p1}"
2581                 + " order by id";
2582 
2583         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
2584 
2585         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2586     }
2587 
2588     @Test
2589     void testFromJoinWhereOrderByB2() {
2590         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2591                 .from(StudentDynamicSqlSupport.student);
2592 
2593         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2594                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2595 
2596         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2597 
2598         builder3.orderBy(StudentDynamicSqlSupport.id);
2599 
2600         String expected = "select student.id, student.name, student.idcard"
2601                 + " from student"
2602                 + " join student_reg on student.id = student_reg.studentId"
2603                 + " where student.idcard = #{parameters.p1}"
2604                 + " order by id";
2605 
2606         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
2607 
2608         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2609     }
2610 
2611     @Test
2612     void testFromJoinWhereOrderByB3() {
2613         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2614                 .from(StudentDynamicSqlSupport.student);
2615 
2616         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2617                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2618 
2619         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2620 
2621         builder3.orderBy(StudentDynamicSqlSupport.id);
2622 
2623         String expected = "select student.id, student.name, student.idcard"
2624                 + " from student"
2625                 + " join student_reg on student.id = student_reg.studentId"
2626                 + " where student.idcard = #{parameters.p1}"
2627                 + " order by id";
2628 
2629         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
2630 
2631         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2632     }
2633 
2634     @Test
2635     void testFromJoinWhereOrderByB4() {
2636         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2637                 .from(StudentDynamicSqlSupport.student);
2638 
2639         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2640                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2641 
2642         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2643 
2644         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2645 
2646         String expected = "select student.id, student.name, student.idcard"
2647                 + " from student"
2648                 + " join student_reg on student.id = student_reg.studentId"
2649                 + " where student.idcard = #{parameters.p1}"
2650                 + " order by id";
2651 
2652         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
2653 
2654         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2655     }
2656 
2657     @Test
2658     void testFromJoinWhereOrderByLimitB1() {
2659         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2660                 .from(StudentDynamicSqlSupport.student);
2661 
2662         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2663                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2664 
2665         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2666 
2667         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2668 
2669         builder4.limit(3);
2670 
2671         String expected = "select student.id, student.name, student.idcard"
2672                 + " from student"
2673                 + " join student_reg on student.id = student_reg.studentId"
2674                 + " where student.idcard = #{parameters.p1}"
2675                 + " order by id"
2676                 + " limit #{parameters.p2}";
2677 
2678         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
2679 
2680         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2681     }
2682 
2683     @Test
2684     void testFromJoinWhereOrderByLimitB2() {
2685         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2686                 .from(StudentDynamicSqlSupport.student);
2687 
2688         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2689                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2690 
2691         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2692 
2693         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2694 
2695         builder4.limit(3);
2696 
2697         String expected = "select student.id, student.name, student.idcard"
2698                 + " from student"
2699                 + " join student_reg on student.id = student_reg.studentId"
2700                 + " where student.idcard = #{parameters.p1}"
2701                 + " order by id"
2702                 + " limit #{parameters.p2}";
2703 
2704         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
2705 
2706         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2707     }
2708 
2709     @Test
2710     void testFromJoinWhereOrderByLimitB3() {
2711         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2712                 .from(StudentDynamicSqlSupport.student);
2713 
2714         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2715                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2716 
2717         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2718 
2719         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2720 
2721         builder4.limit(3);
2722 
2723         String expected = "select student.id, student.name, student.idcard"
2724                 + " from student"
2725                 + " join student_reg on student.id = student_reg.studentId"
2726                 + " where student.idcard = #{parameters.p1}"
2727                 + " order by id"
2728                 + " limit #{parameters.p2}";
2729 
2730         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
2731 
2732         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2733     }
2734 
2735     @Test
2736     void testFromJoinWhereOrderByLimitB4() {
2737         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2738                 .from(StudentDynamicSqlSupport.student);
2739 
2740         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2741                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2742 
2743         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2744 
2745         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2746 
2747         builder4.limit(3);
2748 
2749         String expected = "select student.id, student.name, student.idcard"
2750                 + " from student"
2751                 + " join student_reg on student.id = student_reg.studentId"
2752                 + " where student.idcard = #{parameters.p1}"
2753                 + " order by id"
2754                 + " limit #{parameters.p2}";
2755 
2756         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
2757 
2758         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2759     }
2760 
2761     @Test
2762     void testFromJoinWhereOrderByLimitB5() {
2763         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2764                 .from(StudentDynamicSqlSupport.student);
2765 
2766         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2767                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2768 
2769         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2770 
2771         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2772 
2773         var builder5 = builder4.limit(3);
2774 
2775         String expected = "select student.id, student.name, student.idcard"
2776                 + " from student"
2777                 + " join student_reg on student.id = student_reg.studentId"
2778                 + " where student.idcard = #{parameters.p1}"
2779                 + " order by id"
2780                 + " limit #{parameters.p2}";
2781 
2782         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
2783 
2784         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2785     }
2786 
2787     @Test
2788     void testFromJoinWhereOrderByLimitOffsetB1() {
2789         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2790                 .from(StudentDynamicSqlSupport.student);
2791 
2792         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2793                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2794 
2795         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2796 
2797         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2798 
2799         var builder5 = builder4.limit(3);
2800 
2801         builder5.offset(2);
2802 
2803         String expected = "select student.id, student.name, student.idcard"
2804                 + " from student"
2805                 + " join student_reg on student.id = student_reg.studentId"
2806                 + " where student.idcard = #{parameters.p1}"
2807                 + " order by id"
2808                 + " limit #{parameters.p2}"
2809                 + " offset #{parameters.p3}";
2810 
2811         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
2812 
2813         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2814     }
2815 
2816     @Test
2817     void testFromJoinWhereOrderByLimitOffsetB2() {
2818         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2819                 .from(StudentDynamicSqlSupport.student);
2820 
2821         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2822                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2823 
2824         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2825 
2826         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2827 
2828         var builder5 = builder4.limit(3);
2829 
2830         builder5.offset(2);
2831 
2832         String expected = "select student.id, student.name, student.idcard"
2833                 + " from student"
2834                 + " join student_reg on student.id = student_reg.studentId"
2835                 + " where student.idcard = #{parameters.p1}"
2836                 + " order by id"
2837                 + " limit #{parameters.p2}"
2838                 + " offset #{parameters.p3}";
2839 
2840         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
2841 
2842         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2843     }
2844 
2845     @Test
2846     void testFromJoinWhereOrderByLimitOffsetB3() {
2847         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2848                 .from(StudentDynamicSqlSupport.student);
2849 
2850         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2851                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2852 
2853         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2854 
2855         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2856 
2857         var builder5 = builder4.limit(3);
2858 
2859         builder5.offset(2);
2860 
2861         String expected = "select student.id, student.name, student.idcard"
2862                 + " from student"
2863                 + " join student_reg on student.id = student_reg.studentId"
2864                 + " where student.idcard = #{parameters.p1}"
2865                 + " order by id"
2866                 + " limit #{parameters.p2}"
2867                 + " offset #{parameters.p3}";
2868 
2869         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
2870 
2871         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2872     }
2873 
2874     @Test
2875     void testFromJoinWhereOrderByLimitOffsetB4() {
2876         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2877                 .from(StudentDynamicSqlSupport.student);
2878 
2879         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2880                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2881 
2882         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2883 
2884         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2885 
2886         var builder5 = builder4.limit(3);
2887 
2888         builder5.offset(2);
2889 
2890         String expected = "select student.id, student.name, student.idcard"
2891                 + " from student"
2892                 + " join student_reg on student.id = student_reg.studentId"
2893                 + " where student.idcard = #{parameters.p1}"
2894                 + " order by id"
2895                 + " limit #{parameters.p2}"
2896                 + " offset #{parameters.p3}";
2897 
2898         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
2899 
2900         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2901     }
2902 
2903     @Test
2904     void testFromJoinWhereOrderByLimitOffsetB5() {
2905         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2906                 .from(StudentDynamicSqlSupport.student);
2907 
2908         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2909                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2910 
2911         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2912 
2913         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2914 
2915         var builder5 = builder4.limit(3);
2916 
2917         builder5.offset(2);
2918 
2919         String expected = "select student.id, student.name, student.idcard"
2920                 + " from student"
2921                 + " join student_reg on student.id = student_reg.studentId"
2922                 + " where student.idcard = #{parameters.p1}"
2923                 + " order by id"
2924                 + " limit #{parameters.p2}"
2925                 + " offset #{parameters.p3}";
2926 
2927         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
2928 
2929         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2930     }
2931 
2932     @Test
2933     void testFromJoinWhereOrderByLimitOffsetB6() {
2934         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2935                 .from(StudentDynamicSqlSupport.student);
2936 
2937         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2938                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2939 
2940         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2941 
2942         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2943 
2944         var builder5 = builder4.limit(3);
2945 
2946         var builder6 = builder5.offset(2);
2947 
2948         String expected = "select student.id, student.name, student.idcard"
2949                 + " from student"
2950                 + " join student_reg on student.id = student_reg.studentId"
2951                 + " where student.idcard = #{parameters.p1}"
2952                 + " order by id"
2953                 + " limit #{parameters.p2}"
2954                 + " offset #{parameters.p3}";
2955 
2956         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
2957 
2958         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2959     }
2960 
2961     @Test
2962     void testFromJoinWhereOrderByOffsetB1() {
2963         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2964                 .from(StudentDynamicSqlSupport.student);
2965 
2966         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2967                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2968 
2969         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2970 
2971         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2972 
2973         builder4.offset(2);
2974 
2975         String expected = "select student.id, student.name, student.idcard"
2976                 + " from student"
2977                 + " join student_reg on student.id = student_reg.studentId"
2978                 + " where student.idcard = #{parameters.p1}"
2979                 + " order by id"
2980                 + " offset #{parameters.p2} rows";
2981 
2982         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
2983 
2984         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
2985     }
2986 
2987     @Test
2988     void testFromJoinWhereOrderByOffsetB2() {
2989         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
2990                 .from(StudentDynamicSqlSupport.student);
2991 
2992         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
2993                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
2994 
2995         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
2996 
2997         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
2998 
2999         builder4.offset(2);
3000 
3001         String expected = "select student.id, student.name, student.idcard"
3002                 + " from student"
3003                 + " join student_reg on student.id = student_reg.studentId"
3004                 + " where student.idcard = #{parameters.p1}"
3005                 + " order by id"
3006                 + " offset #{parameters.p2} rows";
3007 
3008         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3009 
3010         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3011     }
3012 
3013     @Test
3014     void testFromJoinWhereOrderByOffsetB3() {
3015         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3016                 .from(StudentDynamicSqlSupport.student);
3017 
3018         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3019                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3020 
3021         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3022 
3023         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3024 
3025         builder4.offset(2);
3026 
3027         String expected = "select student.id, student.name, student.idcard"
3028                 + " from student"
3029                 + " join student_reg on student.id = student_reg.studentId"
3030                 + " where student.idcard = #{parameters.p1}"
3031                 + " order by id"
3032                 + " offset #{parameters.p2} rows";
3033 
3034         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3035 
3036         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3037     }
3038 
3039     @Test
3040     void testFromJoinWhereOrderByOffsetB4() {
3041         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3042                 .from(StudentDynamicSqlSupport.student);
3043 
3044         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3045                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3046 
3047         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3048 
3049         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3050 
3051         builder4.offset(2);
3052 
3053         String expected = "select student.id, student.name, student.idcard"
3054                 + " from student"
3055                 + " join student_reg on student.id = student_reg.studentId"
3056                 + " where student.idcard = #{parameters.p1}"
3057                 + " order by id"
3058                 + " offset #{parameters.p2} rows";
3059 
3060         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3061 
3062         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3063     }
3064 
3065     @Test
3066     void testFromJoinWhereOrderByOffsetB5() {
3067         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3068                 .from(StudentDynamicSqlSupport.student);
3069 
3070         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3071                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3072 
3073         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3074 
3075         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3076 
3077         var builder5 = builder4.offset(2);
3078 
3079         String expected = "select student.id, student.name, student.idcard"
3080                 + " from student"
3081                 + " join student_reg on student.id = student_reg.studentId"
3082                 + " where student.idcard = #{parameters.p1}"
3083                 + " order by id"
3084                 + " offset #{parameters.p2} rows";
3085 
3086         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
3087 
3088         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3089     }
3090 
3091     @Test
3092     void testFromJoinWhereOrderByOffsetFetchFirstB1() {
3093         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3094                 .from(StudentDynamicSqlSupport.student);
3095 
3096         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3097                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3098 
3099         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3100 
3101         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3102 
3103         var builder5 = builder4.offset(2);
3104 
3105         builder5.fetchFirst(3).rowsOnly();
3106 
3107         String expected = "select student.id, student.name, student.idcard"
3108                 + " from student"
3109                 + " join student_reg on student.id = student_reg.studentId"
3110                 + " where student.idcard = #{parameters.p1}"
3111                 + " order by id"
3112                 + " offset #{parameters.p2} rows"
3113                 + " fetch first #{parameters.p3} rows only";
3114 
3115         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
3116 
3117         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3118     }
3119 
3120     @Test
3121     void testFromJoinWhereOrderByOffsetFetchFirstB2() {
3122         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3123                 .from(StudentDynamicSqlSupport.student);
3124 
3125         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3126                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3127 
3128         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3129 
3130         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3131 
3132         var builder5 = builder4.offset(2);
3133 
3134         builder5.fetchFirst(3).rowsOnly();
3135 
3136         String expected = "select student.id, student.name, student.idcard"
3137                 + " from student"
3138                 + " join student_reg on student.id = student_reg.studentId"
3139                 + " where student.idcard = #{parameters.p1}"
3140                 + " order by id"
3141                 + " offset #{parameters.p2} rows"
3142                 + " fetch first #{parameters.p3} rows only";
3143 
3144         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3145 
3146         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3147     }
3148 
3149     @Test
3150     void testFromJoinWhereOrderByOffsetFetchFirstB3() {
3151         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3152                 .from(StudentDynamicSqlSupport.student);
3153 
3154         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3155                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3156 
3157         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3158 
3159         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3160 
3161         var builder5 = builder4.offset(2);
3162 
3163         builder5.fetchFirst(3).rowsOnly();
3164 
3165         String expected = "select student.id, student.name, student.idcard"
3166                 + " from student"
3167                 + " join student_reg on student.id = student_reg.studentId"
3168                 + " where student.idcard = #{parameters.p1}"
3169                 + " order by id"
3170                 + " offset #{parameters.p2} rows"
3171                 + " fetch first #{parameters.p3} rows only";
3172 
3173         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3174 
3175         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3176     }
3177 
3178     @Test
3179     void testFromJoinWhereOrderByOffsetFetchFirstB4() {
3180         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3181                 .from(StudentDynamicSqlSupport.student);
3182 
3183         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3184                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3185 
3186         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3187 
3188         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3189 
3190         var builder5 = builder4.offset(2);
3191 
3192         builder5.fetchFirst(3).rowsOnly();
3193 
3194         String expected = "select student.id, student.name, student.idcard"
3195                 + " from student"
3196                 + " join student_reg on student.id = student_reg.studentId"
3197                 + " where student.idcard = #{parameters.p1}"
3198                 + " order by id"
3199                 + " offset #{parameters.p2} rows"
3200                 + " fetch first #{parameters.p3} rows only";
3201 
3202         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3203 
3204         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3205     }
3206 
3207     @Test
3208     void testFromJoinWhereOrderByOffsetFetchFirstB5() {
3209         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3210                 .from(StudentDynamicSqlSupport.student);
3211 
3212         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3213                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3214 
3215         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3216 
3217         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3218 
3219         var builder5 = builder4.offset(2);
3220 
3221         builder5.fetchFirst(3).rowsOnly();
3222 
3223         String expected = "select student.id, student.name, student.idcard"
3224                 + " from student"
3225                 + " join student_reg on student.id = student_reg.studentId"
3226                 + " where student.idcard = #{parameters.p1}"
3227                 + " order by id"
3228                 + " offset #{parameters.p2} rows"
3229                 + " fetch first #{parameters.p3} rows only";
3230 
3231         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
3232 
3233         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3234     }
3235 
3236     @Test
3237     void testFromJoinWhereOrderByOffsetFetchFirstB6() {
3238         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3239                 .from(StudentDynamicSqlSupport.student);
3240 
3241         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3242                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3243 
3244         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3245 
3246         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3247 
3248         var builder5 = builder4.offset(2);
3249 
3250         var builder6 = builder5.fetchFirst(3).rowsOnly();
3251 
3252         String expected = "select student.id, student.name, student.idcard"
3253                 + " from student"
3254                 + " join student_reg on student.id = student_reg.studentId"
3255                 + " where student.idcard = #{parameters.p1}"
3256                 + " order by id"
3257                 + " offset #{parameters.p2} rows"
3258                 + " fetch first #{parameters.p3} rows only";
3259 
3260         SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategies.MYBATIS3);
3261 
3262         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3263     }
3264 
3265     @Test
3266     void testFromJoinWhereOrderByFetchFirstB1() {
3267         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3268                 .from(StudentDynamicSqlSupport.student);
3269 
3270         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3271                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3272 
3273         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3274 
3275         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3276 
3277         builder4.fetchFirst(3).rowsOnly();
3278 
3279         String expected = "select student.id, student.name, student.idcard"
3280                 + " from student"
3281                 + " join student_reg on student.id = student_reg.studentId"
3282                 + " where student.idcard = #{parameters.p1}"
3283                 + " order by id"
3284                 + " fetch first #{parameters.p2} rows only";
3285 
3286         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
3287 
3288         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3289     }
3290 
3291     @Test
3292     void testFromJoinWhereOrderByFetchFirstB2() {
3293         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3294                 .from(StudentDynamicSqlSupport.student);
3295 
3296         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3297                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3298 
3299         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3300 
3301         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3302 
3303         builder4.fetchFirst(3).rowsOnly();
3304 
3305         String expected = "select student.id, student.name, student.idcard"
3306                 + " from student"
3307                 + " join student_reg on student.id = student_reg.studentId"
3308                 + " where student.idcard = #{parameters.p1}"
3309                 + " order by id"
3310                 + " fetch first #{parameters.p2} rows only";
3311 
3312         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3313 
3314         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3315     }
3316 
3317     @Test
3318     void testFromJoinWhereOrderByFetchFirstB3() {
3319         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3320                 .from(StudentDynamicSqlSupport.student);
3321 
3322         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3323                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3324 
3325         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3326 
3327         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3328 
3329         builder4.fetchFirst(3).rowsOnly();
3330 
3331         String expected = "select student.id, student.name, student.idcard"
3332                 + " from student"
3333                 + " join student_reg on student.id = student_reg.studentId"
3334                 + " where student.idcard = #{parameters.p1}"
3335                 + " order by id"
3336                 + " fetch first #{parameters.p2} rows only";
3337 
3338         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3339 
3340         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3341     }
3342 
3343     @Test
3344     void testFromJoinWhereOrderByFetchFirstB4() {
3345         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3346                 .from(StudentDynamicSqlSupport.student);
3347 
3348         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3349                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3350 
3351         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3352 
3353         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3354 
3355         builder4.fetchFirst(3).rowsOnly();
3356 
3357         String expected = "select student.id, student.name, student.idcard"
3358                 + " from student"
3359                 + " join student_reg on student.id = student_reg.studentId"
3360                 + " where student.idcard = #{parameters.p1}"
3361                 + " order by id"
3362                 + " fetch first #{parameters.p2} rows only";
3363 
3364         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3365 
3366         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3367     }
3368 
3369     @Test
3370     void testFromJoinWhereOrderByFetchFirstB5() {
3371         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3372                 .from(StudentDynamicSqlSupport.student);
3373 
3374         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3375                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3376 
3377         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3378 
3379         SelectDSL<SelectModel> builder4 = builder3.orderBy(StudentDynamicSqlSupport.id);
3380 
3381         var builder5 = builder4.fetchFirst(3).rowsOnly();
3382 
3383         String expected = "select student.id, student.name, student.idcard"
3384                 + " from student"
3385                 + " join student_reg on student.id = student_reg.studentId"
3386                 + " where student.idcard = #{parameters.p1}"
3387                 + " order by id"
3388                 + " fetch first #{parameters.p2} rows only";
3389 
3390         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
3391 
3392         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3393     }
3394 
3395     @Test
3396     void testFromJoinWhereLimitB1() {
3397         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3398                 .from(StudentDynamicSqlSupport.student);
3399 
3400         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3401                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3402 
3403         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3404 
3405         builder3.limit(2);
3406 
3407         String expected = "select student.id, student.name, student.idcard"
3408                 + " from student"
3409                 + " join student_reg on student.id = student_reg.studentId"
3410                 + " where student.idcard = #{parameters.p1}"
3411                 + " limit #{parameters.p2}";
3412 
3413         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
3414 
3415         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3416     }
3417 
3418     @Test
3419     void testFromJoinWhereLimitB2() {
3420         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3421                 .from(StudentDynamicSqlSupport.student);
3422 
3423         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3424                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3425 
3426         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3427 
3428         builder3.limit(2);
3429 
3430         String expected = "select student.id, student.name, student.idcard"
3431                 + " from student"
3432                 + " join student_reg on student.id = student_reg.studentId"
3433                 + " where student.idcard = #{parameters.p1}"
3434                 + " limit #{parameters.p2}";
3435 
3436         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3437 
3438         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3439     }
3440 
3441     @Test
3442     void testFromJoinWhereLimitB3() {
3443         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3444                 .from(StudentDynamicSqlSupport.student);
3445 
3446         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3447                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3448 
3449         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3450 
3451         builder3.limit(2);
3452 
3453         String expected = "select student.id, student.name, student.idcard"
3454                 + " from student"
3455                 + " join student_reg on student.id = student_reg.studentId"
3456                 + " where student.idcard = #{parameters.p1}"
3457                 + " limit #{parameters.p2}";
3458 
3459         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3460 
3461         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3462     }
3463 
3464     @Test
3465     void testFromJoinWhereLimitB4() {
3466         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3467                 .from(StudentDynamicSqlSupport.student);
3468 
3469         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3470                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3471 
3472         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3473 
3474         var builder4 = builder3.limit(2);
3475 
3476         String expected = "select student.id, student.name, student.idcard"
3477                 + " from student"
3478                 + " join student_reg on student.id = student_reg.studentId"
3479                 + " where student.idcard = #{parameters.p1}"
3480                 + " limit #{parameters.p2}";
3481 
3482         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3483 
3484         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3485     }
3486 
3487     @Test
3488     void testFromJoinWhereLimitOffsetB1() {
3489         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3490                 .from(StudentDynamicSqlSupport.student);
3491 
3492         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3493                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3494 
3495         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3496 
3497         var builder4 = builder3.limit(2);
3498 
3499         builder4.offset(3);
3500 
3501         String expected = "select student.id, student.name, student.idcard"
3502                 + " from student"
3503                 + " join student_reg on student.id = student_reg.studentId"
3504                 + " where student.idcard = #{parameters.p1}"
3505                 + " limit #{parameters.p2}"
3506                 + " offset #{parameters.p3}";
3507 
3508         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
3509 
3510         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3511     }
3512 
3513     @Test
3514     void testFromJoinWhereLimitOffsetB2() {
3515         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3516                 .from(StudentDynamicSqlSupport.student);
3517 
3518         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3519                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3520 
3521         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3522 
3523         var builder4 = builder3.limit(2);
3524 
3525         builder4.offset(3);
3526 
3527         String expected = "select student.id, student.name, student.idcard"
3528                 + " from student"
3529                 + " join student_reg on student.id = student_reg.studentId"
3530                 + " where student.idcard = #{parameters.p1}"
3531                 + " limit #{parameters.p2}"
3532                 + " offset #{parameters.p3}";
3533 
3534         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3535 
3536         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3537     }
3538 
3539     @Test
3540     void testFromJoinWhereLimitOffsetB3() {
3541         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3542                 .from(StudentDynamicSqlSupport.student);
3543 
3544         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3545                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3546 
3547         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3548 
3549         var builder4 = builder3.limit(2);
3550 
3551         builder4.offset(3);
3552 
3553         String expected = "select student.id, student.name, student.idcard"
3554                 + " from student"
3555                 + " join student_reg on student.id = student_reg.studentId"
3556                 + " where student.idcard = #{parameters.p1}"
3557                 + " limit #{parameters.p2}"
3558                 + " offset #{parameters.p3}";
3559 
3560         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3561 
3562         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3563     }
3564 
3565     @Test
3566     void testFromJoinWhereLimitOffsetB4() {
3567         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3568                 .from(StudentDynamicSqlSupport.student);
3569 
3570         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3571                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3572 
3573         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3574 
3575         var builder4 = builder3.limit(2);
3576 
3577         builder4.offset(3);
3578 
3579         String expected = "select student.id, student.name, student.idcard"
3580                 + " from student"
3581                 + " join student_reg on student.id = student_reg.studentId"
3582                 + " where student.idcard = #{parameters.p1}"
3583                 + " limit #{parameters.p2}"
3584                 + " offset #{parameters.p3}";
3585 
3586         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3587 
3588         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3589     }
3590 
3591     @Test
3592     void testFromJoinWhereLimitOffsetB5() {
3593         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3594                 .from(StudentDynamicSqlSupport.student);
3595 
3596         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3597                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3598 
3599         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3600 
3601         var builder4 = builder3.limit(2);
3602 
3603         var builder5 = builder4.offset(3);
3604 
3605         String expected = "select student.id, student.name, student.idcard"
3606                 + " from student"
3607                 + " join student_reg on student.id = student_reg.studentId"
3608                 + " where student.idcard = #{parameters.p1}"
3609                 + " limit #{parameters.p2}"
3610                 + " offset #{parameters.p3}";
3611 
3612         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
3613 
3614         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3615     }
3616 
3617     @Test
3618     void testFromJoinWhereOffsetB1() {
3619         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3620                 .from(StudentDynamicSqlSupport.student);
3621 
3622         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3623                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3624 
3625         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3626 
3627         builder3.offset(3);
3628 
3629         String expected = "select student.id, student.name, student.idcard"
3630                 + " from student"
3631                 + " join student_reg on student.id = student_reg.studentId"
3632                 + " where student.idcard = #{parameters.p1}"
3633                 + " offset #{parameters.p2} rows";
3634 
3635         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
3636 
3637         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3638     }
3639 
3640     @Test
3641     void testFromJoinWhereOffsetB2() {
3642         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3643                 .from(StudentDynamicSqlSupport.student);
3644 
3645         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3646                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3647 
3648         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3649 
3650         builder3.offset(3);
3651 
3652         String expected = "select student.id, student.name, student.idcard"
3653                 + " from student"
3654                 + " join student_reg on student.id = student_reg.studentId"
3655                 + " where student.idcard = #{parameters.p1}"
3656                 + " offset #{parameters.p2} rows";
3657 
3658         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3659 
3660         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3661     }
3662 
3663     @Test
3664     void testFromJoinWhereOffsetB3() {
3665         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3666                 .from(StudentDynamicSqlSupport.student);
3667 
3668         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3669                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3670 
3671         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3672 
3673         builder3.offset(3);
3674 
3675         String expected = "select student.id, student.name, student.idcard"
3676                 + " from student"
3677                 + " join student_reg on student.id = student_reg.studentId"
3678                 + " where student.idcard = #{parameters.p1}"
3679                 + " offset #{parameters.p2} rows";
3680 
3681         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3682 
3683         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3684     }
3685 
3686     @Test
3687     void testFromJoinWhereOffsetB4() {
3688         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3689                 .from(StudentDynamicSqlSupport.student);
3690 
3691         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3692                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3693 
3694         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3695 
3696         var builder4 = builder3.offset(3);
3697 
3698         String expected = "select student.id, student.name, student.idcard"
3699                 + " from student"
3700                 + " join student_reg on student.id = student_reg.studentId"
3701                 + " where student.idcard = #{parameters.p1}"
3702                 + " offset #{parameters.p2} rows";
3703 
3704         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3705 
3706         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3707     }
3708 
3709     @Test
3710     void testFromJoinWhereOffsetFetchFirstB1() {
3711         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3712                 .from(StudentDynamicSqlSupport.student);
3713 
3714         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3715                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3716 
3717         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3718 
3719         var builder4 = builder3.offset(3);
3720 
3721         builder4.fetchFirst(2).rowsOnly();
3722 
3723         String expected = "select student.id, student.name, student.idcard"
3724                 + " from student"
3725                 + " join student_reg on student.id = student_reg.studentId"
3726                 + " where student.idcard = #{parameters.p1}"
3727                 + " offset #{parameters.p2} rows"
3728                 + " fetch first #{parameters.p3} rows only";
3729 
3730         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
3731 
3732         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3733     }
3734 
3735     @Test
3736     void testFromJoinWhereOffsetFetchFirstB2() {
3737         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3738                 .from(StudentDynamicSqlSupport.student);
3739 
3740         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3741                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3742 
3743         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3744 
3745         var builder4 = builder3.offset(3);
3746 
3747         builder4.fetchFirst(2).rowsOnly();
3748 
3749         String expected = "select student.id, student.name, student.idcard"
3750                 + " from student"
3751                 + " join student_reg on student.id = student_reg.studentId"
3752                 + " where student.idcard = #{parameters.p1}"
3753                 + " offset #{parameters.p2} rows"
3754                 + " fetch first #{parameters.p3} rows only";
3755 
3756         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3757 
3758         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3759     }
3760 
3761     @Test
3762     void testFromJoinWhereOffsetFetchFirstB3() {
3763         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3764                 .from(StudentDynamicSqlSupport.student);
3765 
3766         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3767                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3768 
3769         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3770 
3771         var builder4 = builder3.offset(3);
3772 
3773         builder4.fetchFirst(2).rowsOnly();
3774 
3775         String expected = "select student.id, student.name, student.idcard"
3776                 + " from student"
3777                 + " join student_reg on student.id = student_reg.studentId"
3778                 + " where student.idcard = #{parameters.p1}"
3779                 + " offset #{parameters.p2} rows"
3780                 + " fetch first #{parameters.p3} rows only";
3781 
3782         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3783 
3784         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3785     }
3786 
3787     @Test
3788     void testFromJoinWhereOffsetFetchFirstB4() {
3789         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3790                 .from(StudentDynamicSqlSupport.student);
3791 
3792         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3793                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3794 
3795         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3796 
3797         var builder4 = builder3.offset(3);
3798 
3799         builder4.fetchFirst(2).rowsOnly();
3800 
3801         String expected = "select student.id, student.name, student.idcard"
3802                 + " from student"
3803                 + " join student_reg on student.id = student_reg.studentId"
3804                 + " where student.idcard = #{parameters.p1}"
3805                 + " offset #{parameters.p2} rows"
3806                 + " fetch first #{parameters.p3} rows only";
3807 
3808         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3809 
3810         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3811     }
3812 
3813     @Test
3814     void testFromJoinWhereOffsetFetchFirstB5() {
3815         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3816                 .from(StudentDynamicSqlSupport.student);
3817 
3818         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3819                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3820 
3821         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3822 
3823         var builder4 = builder3.offset(3);
3824 
3825         var builder5 = builder4.fetchFirst(2).rowsOnly();
3826 
3827         String expected = "select student.id, student.name, student.idcard"
3828                 + " from student"
3829                 + " join student_reg on student.id = student_reg.studentId"
3830                 + " where student.idcard = #{parameters.p1}"
3831                 + " offset #{parameters.p2} rows"
3832                 + " fetch first #{parameters.p3} rows only";
3833 
3834         SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategies.MYBATIS3);
3835 
3836         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3837     }
3838 
3839     @Test
3840     void testFromJoinWhereFetchFirstB1() {
3841         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3842                 .from(StudentDynamicSqlSupport.student);
3843 
3844         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3845                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3846 
3847         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3848 
3849         builder3.fetchFirst(2).rowsOnly();
3850 
3851         String expected = "select student.id, student.name, student.idcard"
3852                 + " from student"
3853                 + " join student_reg on student.id = student_reg.studentId"
3854                 + " where student.idcard = #{parameters.p1}"
3855                 + " fetch first #{parameters.p2} rows only";
3856 
3857         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
3858 
3859         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3860     }
3861 
3862     @Test
3863     void testFromJoinWhereFetchFirstB2() {
3864         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3865                 .from(StudentDynamicSqlSupport.student);
3866 
3867         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3868                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3869 
3870         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3871 
3872         builder3.fetchFirst(2).rowsOnly();
3873 
3874         String expected = "select student.id, student.name, student.idcard"
3875                 + " from student"
3876                 + " join student_reg on student.id = student_reg.studentId"
3877                 + " where student.idcard = #{parameters.p1}"
3878                 + " fetch first #{parameters.p2} rows only";
3879 
3880         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
3881 
3882         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3883     }
3884 
3885     @Test
3886     void testFromJoinWhereFetchFirstB3() {
3887         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3888                 .from(StudentDynamicSqlSupport.student);
3889 
3890         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3891                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3892 
3893         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3894 
3895         builder3.fetchFirst(2).rowsOnly();
3896 
3897         String expected = "select student.id, student.name, student.idcard"
3898                 + " from student"
3899                 + " join student_reg on student.id = student_reg.studentId"
3900                 + " where student.idcard = #{parameters.p1}"
3901                 + " fetch first #{parameters.p2} rows only";
3902 
3903         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
3904 
3905         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3906     }
3907 
3908     @Test
3909     void testFromJoinWhereFetchFirstB4() {
3910         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
3911                 .from(StudentDynamicSqlSupport.student);
3912 
3913         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg)
3914                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
3915 
3916         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
3917 
3918         var builder4 = builder3.fetchFirst(2).rowsOnly();
3919 
3920         String expected = "select student.id, student.name, student.idcard"
3921                 + " from student"
3922                 + " join student_reg on student.id = student_reg.studentId"
3923                 + " where student.idcard = #{parameters.p1}"
3924                 + " fetch first #{parameters.p2} rows only";
3925 
3926         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
3927 
3928         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
3929     }
3930 }