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 examples.complexquery;
17  
18  import static examples.complexquery.PersonDynamicSqlSupport.firstName;
19  import static examples.complexquery.PersonDynamicSqlSupport.id;
20  import static examples.complexquery.PersonDynamicSqlSupport.lastName;
21  import static examples.complexquery.PersonDynamicSqlSupport.person;
22  import static org.assertj.core.api.Assertions.assertThat;
23  import static org.mybatis.dynamic.sql.SqlBuilder.*;
24  
25  import org.jspecify.annotations.Nullable;
26  import org.junit.jupiter.api.Test;
27  import org.mybatis.dynamic.sql.render.RenderingStrategies;
28  import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
29  import org.mybatis.dynamic.sql.select.SelectModel;
30  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
31  
32  class ComplexQueryTest {
33  
34      @Test
35      void testId() {
36          SelectStatementProvider selectStatement = search(2, null, null);
37  
38          String expected = "select person_id, first_name, last_name"
39                  + " from Person"
40                  + " where person_id = #{parameters.p1}"
41                  + " order by last_name, first_name"
42                  + " fetch first #{parameters.p2} rows only";
43  
44          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
45          assertThat(selectStatement.getParameters()).containsEntry("p1", 2);
46          assertThat(selectStatement.getParameters()).containsEntry("p2", 50L);
47      }
48  
49      @Test
50      void testFirstNameOnly() {
51          SelectStatementProvider selectStatement = search(null, "fred", null);
52  
53          String expected = "select person_id, first_name, last_name"
54                  + " from Person"
55                  + " where first_name like #{parameters.p1}"
56                  + " order by last_name, first_name"
57                  + " fetch first #{parameters.p2} rows only";
58  
59          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
60          assertThat(selectStatement.getParameters()).containsEntry("p1", "%fred%");
61          assertThat(selectStatement.getParameters()).containsEntry("p2", 50L);
62      }
63  
64      @Test
65      void testLastNameOnly() {
66          SelectStatementProvider selectStatement = search(null, null, "flintstone");
67  
68          String expected = "select person_id, first_name, last_name"
69                  + " from Person"
70                  + " where last_name like #{parameters.p1}"
71                  + " order by last_name, first_name"
72                  + " fetch first #{parameters.p2} rows only";
73  
74          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
75          assertThat(selectStatement.getParameters()).containsEntry("p1", "%flintstone%");
76          assertThat(selectStatement.getParameters()).containsEntry("p2", 50L);
77      }
78  
79      @Test
80      void testBothNames() {
81          SelectStatementProvider selectStatement = search(null, "fred", "flintstone");
82  
83          String expected = "select person_id, first_name, last_name"
84                  + " from Person"
85                  + " where first_name like #{parameters.p1}"
86                  + " and last_name like #{parameters.p2}"
87                  + " order by last_name, first_name"
88                  + " fetch first #{parameters.p3} rows only";
89  
90          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
91          assertThat(selectStatement.getParameters()).containsEntry("p1", "%fred%");
92          assertThat(selectStatement.getParameters()).containsEntry("p2", "%flintstone%");
93          assertThat(selectStatement.getParameters()).containsEntry("p3", 50L);
94      }
95  
96      @Test
97      void testAllNull() {
98          SelectStatementProvider selectStatement = search(null, null, null);
99  
100         String expected = "select person_id, first_name, last_name"
101                 + " from Person"
102                 + " order by last_name, first_name"
103                 + " fetch first #{parameters.p1} rows only";
104 
105         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
106         assertThat(selectStatement.getParameters()).containsEntry("p1", 50L);
107     }
108 
109     SelectStatementProvider search(@Nullable Integer targetId, @Nullable String fName, @Nullable String lName) {
110         QueryExpressionDSL<SelectModel>.QueryExpressionWhereBuilder builder = select(id, firstName, lastName)
111                 .from(person)
112                 .where()
113                 .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true));
114 
115         if (targetId != null) {
116             builder.and(id, isEqualTo(targetId));
117         } else {
118             builder
119                 .and(firstName, isLikeWhenPresent(fName).map(s -> "%" + s + "%"))
120                 .and(lastName, isLikeWhenPresent(lName).map(SearchUtils::addWildcards));
121         }
122 
123         builder
124             .orderBy(lastName, firstName)
125             .fetchFirst(50).rowsOnly();
126 
127         return builder.build().render(RenderingStrategies.MYBATIS3);
128     }
129 }