1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 }