1
1
package com .codingapi .springboot .fast .query ;
2
2
3
+ import com .codingapi .springboot .framework .dto .request .Filter ;
3
4
import com .codingapi .springboot .framework .dto .request .PageRequest ;
5
+ import com .codingapi .springboot .framework .dto .request .RequestFilter ;
4
6
import jakarta .persistence .criteria .CriteriaBuilder ;
5
7
import jakarta .persistence .criteria .Order ;
6
8
import jakarta .persistence .criteria .Predicate ;
@@ -24,7 +26,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
24
26
}
25
27
26
28
public <T > Example <T > getExample () {
27
- if (!request .hasFilter ()) {
29
+ RequestFilter requestFilter = request .getRequestFilter ();
30
+ if (!requestFilter .hasFilter ()) {
28
31
return null ;
29
32
}
30
33
Object entity = null ;
@@ -36,7 +39,7 @@ public <T> Example<T> getExample() {
36
39
PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
37
40
for (PropertyDescriptor descriptor : descriptors ) {
38
41
String name = descriptor .getName ();
39
- PageRequest . Filter value = request . getFilters (). get (name );
42
+ Filter value = requestFilter . getFilter (name );
40
43
if (value != null ) {
41
44
try {
42
45
descriptor .getWriteMethod ().invoke (entity , value .getFilterValue (descriptor .getPropertyType ()));
@@ -48,6 +51,16 @@ public <T> Example<T> getExample() {
48
51
}
49
52
50
53
54
+ private List <String > getClazzProperties () {
55
+ List <String > properties = new ArrayList <>();
56
+ PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
57
+ for (PropertyDescriptor descriptor : descriptors ) {
58
+ properties .add (descriptor .getName ());
59
+ }
60
+ return properties ;
61
+ }
62
+
63
+
51
64
public <T > List <Order > getOrder (Root <T > root , CriteriaBuilder criteriaBuilder ) {
52
65
List <Order > orderList = new ArrayList <>();
53
66
request .getSort ().forEach (sort -> {
@@ -60,88 +73,135 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
60
73
return orderList ;
61
74
}
62
75
63
- public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
64
- List <Predicate > predicates = new ArrayList <>();
65
- for (String key : request .getFilters ().keySet ()) {
66
- PageRequest .Filter filter = request .getFilters ().get (key );
76
+
77
+ private <T > Predicate toPredicate (Filter filter , CriteriaBuilder criteriaBuilder , Root <T > root , List <String > properties ) {
78
+ String key = filter .getKey ();
79
+ if (filter .isAndFilters () || filter .isOrFilters () || properties .contains (key )) {
80
+
67
81
if (filter .isEqual ()) {
68
- predicates . add ( criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]) );
82
+ return criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]);
69
83
}
70
84
71
85
if (filter .isLike ()) {
72
86
String matchValue = (String ) filter .getValue ()[0 ];
73
- predicates . add ( criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" ) );
87
+ return criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" );
74
88
}
75
89
76
90
if (filter .isBetween ()) {
77
91
Object value1 = filter .getValue ()[0 ];
78
92
Object value2 = filter .getValue ()[2 ];
79
93
if (value1 instanceof Integer && value2 instanceof Integer ) {
80
- predicates . add ( criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 ) );
94
+ return criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 );
81
95
}
82
96
83
97
if (value1 instanceof Long && value2 instanceof Long ) {
84
- predicates . add ( criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 ) );
98
+ return criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 );
85
99
}
86
100
87
101
if (value1 instanceof Date && value2 instanceof Date ) {
88
- predicates . add ( criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 ) );
102
+ return criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 );
89
103
}
90
104
}
91
105
92
106
if (filter .isGreaterThan ()) {
93
107
Object value = filter .getValue ()[0 ];
94
108
if (value instanceof Integer ) {
95
- predicates . add ( criteriaBuilder .greaterThan (root .get (key ), (Integer ) value ) );
109
+ return criteriaBuilder .greaterThan (root .get (key ), (Integer ) value );
96
110
}
97
111
if (value instanceof Long ) {
98
- predicates . add ( criteriaBuilder .greaterThan (root .get (key ), (Long ) value ) );
112
+ return criteriaBuilder .greaterThan (root .get (key ), (Long ) value );
99
113
}
100
114
if (value instanceof Date ) {
101
- predicates . add ( criteriaBuilder .greaterThan (root .get (key ), (Date ) value ) );
115
+ return criteriaBuilder .greaterThan (root .get (key ), (Date ) value );
102
116
}
103
117
}
104
118
105
119
if (filter .isGreaterThanEqual ()) {
106
120
Object value = filter .getValue ()[0 ];
107
121
if (value instanceof Integer ) {
108
- predicates . add ( criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value ) );
122
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value );
109
123
}
110
124
if (value instanceof Long ) {
111
- predicates . add ( criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value ) );
125
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value );
112
126
}
113
127
if (value instanceof Date ) {
114
- predicates . add ( criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value ) );
128
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value );
115
129
}
116
130
}
117
131
118
132
if (filter .isLessThan ()) {
119
133
Object value = filter .getValue ()[0 ];
120
134
if (value instanceof Integer ) {
121
- predicates . add ( criteriaBuilder .lessThan (root .get (key ), (Integer ) value ) );
135
+ return criteriaBuilder .lessThan (root .get (key ), (Integer ) value );
122
136
}
123
137
if (value instanceof Long ) {
124
- predicates . add ( criteriaBuilder .lessThan (root .get (key ), (Long ) value ) );
138
+ return criteriaBuilder .lessThan (root .get (key ), (Long ) value );
125
139
}
126
140
if (value instanceof Date ) {
127
- predicates . add ( criteriaBuilder .lessThan (root .get (key ), (Date ) value ) );
141
+ return criteriaBuilder .lessThan (root .get (key ), (Date ) value );
128
142
}
129
143
}
130
144
131
145
if (filter .isLessThanEqual ()) {
132
146
Object value = filter .getValue ()[0 ];
133
147
if (value instanceof Integer ) {
134
- predicates . add ( criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value ) );
148
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value );
135
149
}
136
150
if (value instanceof Long ) {
137
- predicates . add ( criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value ) );
151
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value );
138
152
}
139
153
if (value instanceof Date ) {
140
- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Date ) value ));
154
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Date ) value );
155
+ }
156
+ }
157
+
158
+ if (filter .isIn ()) {
159
+ Object [] value = filter .getValue ();
160
+ CriteriaBuilder .In <Object > in = criteriaBuilder .in (root .get (key ));
161
+ for (Object item : value ) {
162
+ in .value (item );
141
163
}
164
+ return in ;
165
+ }
166
+
167
+ if (filter .isOrFilters ()) {
168
+ Filter [] orFilters = (Filter []) filter .getValue ();
169
+ List <Predicate > orPredicates = new ArrayList <>();
170
+ for (Filter orFilter : orFilters ) {
171
+ Predicate predicate = toPredicate (orFilter , criteriaBuilder , root , properties );
172
+ if (predicate != null ) {
173
+ orPredicates .add (predicate );
174
+ }
175
+ }
176
+ return criteriaBuilder .or (orPredicates .toArray (new Predicate [0 ]));
177
+ }
178
+
179
+ if (filter .isAndFilters ()) {
180
+ Filter [] orFilters = (Filter []) filter .getValue ();
181
+ List <Predicate > addPredicates = new ArrayList <>();
182
+ for (Filter orFilter : orFilters ) {
183
+ Predicate predicate = toPredicate (orFilter , criteriaBuilder , root , properties );
184
+ if (predicate != null ) {
185
+ addPredicates .add (predicate );
186
+ }
187
+ }
188
+ return criteriaBuilder .and (addPredicates .toArray (new Predicate [0 ]));
142
189
}
143
190
}
191
+ return null ;
192
+ }
193
+
144
194
195
+ public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
196
+ List <Predicate > predicates = new ArrayList <>();
197
+ List <String > properties = getClazzProperties ();
198
+ RequestFilter requestFilter = request .getRequestFilter ();
199
+ for (Filter filter : requestFilter .getFilters ()) {
200
+ Predicate predicate = toPredicate (filter , criteriaBuilder , root , properties );
201
+ if (predicate != null ) {
202
+ predicates .add (predicate );
203
+ }
204
+ }
145
205
return predicates ;
146
206
}
147
- }
207
+ }
0 commit comments