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.SelectModel;
25  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
26  
27  class Issue100Test {
28  
29      @Test
30      void testNormalUsage() {
31          SelectStatementProvider selectStatement = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
32                  .from(StudentDynamicSqlSupport.student)
33                  .join(StudentRegDynamicSqlSupport.studentReg)
34                  .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
35                  .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"))
36                  .union()
37                  .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
38                  .from(StudentDynamicSqlSupport.student)
39                  .orderBy(StudentDynamicSqlSupport.id)
40                  .limit(3)
41                  .offset(2)
42                  .build()
43                  .render(RenderingStrategies.MYBATIS3);
44  
45          String expected = "select student.id, student.name, student.idcard"
46                  + " from student join student_reg on student.id = student_reg.studentId"
47                  + " where student.idcard = #{parameters.p1}"
48                  + " union"
49                  + " select id, name, idcard"
50                  + " from student"
51                  + " order by id"
52                  + " limit #{parameters.p2}"
53                  + " offset #{parameters.p3}";
54          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
55      }
56  
57      @Test
58      void testSuccessiveBuild01() {
59          QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
60                  .from(StudentDynamicSqlSupport.student);
61  
62          builder.join(StudentRegDynamicSqlSupport.studentReg)
63          .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
64  
65          SelectStatementProvider selectStatement = builder.build()
66                  .render(RenderingStrategies.MYBATIS3);
67  
68          String expected = "select student.id, student.name, student.idcard"
69                  + " from student join student_reg on student.id = student_reg.studentId";
70          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
71      }
72  
73      @Test
74      void testSuccessiveBuild02() {
75          QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
76                  .from(StudentDynamicSqlSupport.student);
77  
78          builder.join(StudentRegDynamicSqlSupport.studentReg)
79          .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
80          .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
81  
82          SelectStatementProvider selectStatement = builder.build()
83                  .render(RenderingStrategies.MYBATIS3);
84  
85          String expected = "select student.id, student.name, student.idcard"
86                  + " from student join student_reg on student.id = student_reg.studentId"
87                  + " where student.idcard = #{parameters.p1}";
88          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
89      }
90  
91      @Test
92      void testSuccessiveBuild03() {
93          QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
94                  .from(StudentDynamicSqlSupport.student);
95  
96          builder.join(StudentRegDynamicSqlSupport.studentReg)
97          .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
98          .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"))
99          .orderBy(StudentDynamicSqlSupport.id);
100 
101         SelectStatementProvider selectStatement = builder.build()
102                 .render(RenderingStrategies.MYBATIS3);
103 
104         String expected = "select student.id, student.name, student.idcard"
105                 + " from student join student_reg on student.id = student_reg.studentId"
106                 + " where student.idcard = #{parameters.p1}"
107                 + " order by id";
108         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
109     }
110 
111     @Test
112     void testSuccessiveBuild04() {
113         QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
114                 .from(StudentDynamicSqlSupport.student);
115 
116         builder.join(StudentRegDynamicSqlSupport.studentReg)
117         .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
118         .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"))
119         .orderBy(StudentDynamicSqlSupport.id)
120         .limit(3);
121 
122         SelectStatementProvider selectStatement = builder.build()
123                 .render(RenderingStrategies.MYBATIS3);
124 
125         String expected = "select student.id, student.name, student.idcard"
126                 + " from student join student_reg on student.id = student_reg.studentId"
127                 + " where student.idcard = #{parameters.p1}"
128                 + " order by id"
129                 + " limit #{parameters.p2}";
130         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
131     }
132 
133     @Test
134     void testSuccessiveBuild05() {
135         QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
136                 .from(StudentDynamicSqlSupport.student);
137 
138         builder.join(StudentRegDynamicSqlSupport.studentReg)
139         .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
140         .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"))
141         .orderBy(StudentDynamicSqlSupport.id)
142         .limit(3)
143         .offset(2);
144 
145         SelectStatementProvider selectStatement = builder.build()
146                 .render(RenderingStrategies.MYBATIS3);
147 
148         String expected = "select student.id, student.name, student.idcard"
149                 + " from student join student_reg on student.id = student_reg.studentId"
150                 + " where student.idcard = #{parameters.p1}"
151                 + " order by id"
152                 + " limit #{parameters.p2}"
153                 + " offset #{parameters.p3}";
154         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
155     }
156 
157     @Test
158     void testSuccessiveBuild06() {
159         QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
160                 .from(StudentDynamicSqlSupport.student);
161 
162         builder.join(StudentRegDynamicSqlSupport.studentReg)
163         .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid))
164         .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"))
165         .orderBy(StudentDynamicSqlSupport.id)
166         .offset(2);
167 
168         SelectStatementProvider selectStatement = builder.build()
169                 .render(RenderingStrategies.MYBATIS3);
170 
171         String expected = "select student.id, student.name, student.idcard"
172                 + " from student join student_reg on student.id = student_reg.studentId"
173                 + " where student.idcard = #{parameters.p1}"
174                 + " order by id"
175                 + " offset #{parameters.p2} rows";
176         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
177     }
178 
179     @Test
180     void testSuccessiveBuild07() {
181         QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
182                 .from(StudentDynamicSqlSupport.student);
183 
184         builder.join(StudentRegDynamicSqlSupport.studentReg)
185         .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
186         .where(StudentDynamicSqlSupport.idcard, equalTo("fred"))
187         .orderBy(StudentDynamicSqlSupport.id)
188         .offset(2)
189         .fetchFirst(3).rowsOnly();
190 
191         SelectStatementProvider selectStatement = builder.build()
192                 .render(RenderingStrategies.MYBATIS3);
193 
194         String expected = "select student.id, student.name, student.idcard"
195                 + " from student join student_reg on student.id = student_reg.studentId"
196                 + " where student.idcard = #{parameters.p1}"
197                 + " order by id"
198                 + " offset #{parameters.p2} rows"
199                 + " fetch first #{parameters.p3} rows only";
200         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
201     }
202 
203     @Test
204     void testSuccessiveBuild08() {
205         QueryExpressionDSL<SelectModel> builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
206                 .from(StudentDynamicSqlSupport.student);
207 
208         builder.join(StudentRegDynamicSqlSupport.studentReg)
209         .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid))
210         .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"))
211         .orderBy(StudentDynamicSqlSupport.id)
212         .fetchFirst(3).rowsOnly();
213 
214         SelectStatementProvider selectStatement = builder.build()
215                 .render(RenderingStrategies.MYBATIS3);
216 
217         String expected = "select student.id, student.name, student.idcard"
218                 + " from student join student_reg on student.id = student_reg.studentId"
219                 + " where student.idcard = #{parameters.p1}"
220                 + " order by id"
221                 + " fetch first #{parameters.p2} rows only";
222         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
223     }
224 
225     @Test
226     void test3() {
227         QueryExpressionDSL<SelectModel>.JoinSpecificationFinisher on = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard)
228                 .from(StudentDynamicSqlSupport.student)
229                 .join(StudentRegDynamicSqlSupport.studentReg)
230                 .on(StudentDynamicSqlSupport.id, isEqualTo(StudentRegDynamicSqlSupport.studentid));
231 
232         on.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred"));
233 
234         SelectStatementProvider selectStatement = on
235                 .build()
236                 .render(RenderingStrategies.MYBATIS3);
237 
238         assertThat(selectStatement.getSelectStatement())
239             .isEqualTo("select student.id, student.name, student.idcard from student join student_reg on student.id = student_reg.studentId where student.idcard = #{parameters.p1}");
240     }
241 }