1
1
package com .codingapi .springboot .fast .query ;
2
2
3
- import com .codingapi .springboot .framework .dto .request .PageRequest ;
4
- import org .springframework .beans .BeanUtils ;
5
- import org .springframework .data .domain .Example ;
6
3
4
+ import com .codingapi .springboot .framework .dto .request .Filter ;
5
+ import com .codingapi .springboot .framework .dto .request .PageRequest ;
6
+ import com .codingapi .springboot .framework .dto .request .RequestFilter ;
7
7
import javax .persistence .criteria .CriteriaBuilder ;
8
8
import javax .persistence .criteria .Order ;
9
9
import javax .persistence .criteria .Predicate ;
10
10
import javax .persistence .criteria .Root ;
11
+ import org .springframework .beans .BeanUtils ;
12
+ import org .springframework .data .domain .Example ;
13
+
11
14
import java .beans .PropertyDescriptor ;
12
15
import java .util .ArrayList ;
13
16
import java .util .Date ;
@@ -24,7 +27,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
24
27
}
25
28
26
29
public <T > Example <T > getExample () {
27
- if (!request .hasFilter ()) {
30
+ RequestFilter requestFilter = request .getRequestFilter ();
31
+ if (!requestFilter .hasFilter ()) {
28
32
return null ;
29
33
}
30
34
Object entity = null ;
@@ -36,7 +40,7 @@ public <T> Example<T> getExample() {
36
40
PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
37
41
for (PropertyDescriptor descriptor : descriptors ) {
38
42
String name = descriptor .getName ();
39
- PageRequest . Filter value = request . getFilters (). get (name );
43
+ Filter value = requestFilter . getFilter (name );
40
44
if (value != null ) {
41
45
try {
42
46
descriptor .getWriteMethod ().invoke (entity , value .getFilterValue (descriptor .getPropertyType ()));
@@ -70,116 +74,120 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
70
74
return orderList ;
71
75
}
72
76
77
+
78
+ private <T > Predicate toPredicate (Filter filter , CriteriaBuilder criteriaBuilder , Root <T > root , List <String > properties ) {
79
+ String key = filter .getKey ();
80
+ if (filter .isOr () || properties .contains (key )) {
81
+
82
+ if (filter .isEqual ()) {
83
+ return criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]);
84
+ }
85
+
86
+ if (filter .isLike ()) {
87
+ String matchValue = (String ) filter .getValue ()[0 ];
88
+ return criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" );
89
+ }
90
+
91
+ if (filter .isBetween ()) {
92
+ Object value1 = filter .getValue ()[0 ];
93
+ Object value2 = filter .getValue ()[2 ];
94
+ if (value1 instanceof Integer && value2 instanceof Integer ) {
95
+ return criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 );
96
+ }
97
+
98
+ if (value1 instanceof Long && value2 instanceof Long ) {
99
+ return criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 );
100
+ }
101
+
102
+ if (value1 instanceof Date && value2 instanceof Date ) {
103
+ return criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 );
104
+ }
105
+ }
106
+
107
+ if (filter .isGreaterThan ()) {
108
+ Object value = filter .getValue ()[0 ];
109
+ if (value instanceof Integer ) {
110
+ return criteriaBuilder .greaterThan (root .get (key ), (Integer ) value );
111
+ }
112
+ if (value instanceof Long ) {
113
+ return criteriaBuilder .greaterThan (root .get (key ), (Long ) value );
114
+ }
115
+ if (value instanceof Date ) {
116
+ return criteriaBuilder .greaterThan (root .get (key ), (Date ) value );
117
+ }
118
+ }
119
+
120
+ if (filter .isGreaterThanEqual ()) {
121
+ Object value = filter .getValue ()[0 ];
122
+ if (value instanceof Integer ) {
123
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value );
124
+ }
125
+ if (value instanceof Long ) {
126
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value );
127
+ }
128
+ if (value instanceof Date ) {
129
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value );
130
+ }
131
+ }
132
+
133
+ if (filter .isLessThan ()) {
134
+ Object value = filter .getValue ()[0 ];
135
+ if (value instanceof Integer ) {
136
+ return criteriaBuilder .lessThan (root .get (key ), (Integer ) value );
137
+ }
138
+ if (value instanceof Long ) {
139
+ return criteriaBuilder .lessThan (root .get (key ), (Long ) value );
140
+ }
141
+ if (value instanceof Date ) {
142
+ return criteriaBuilder .lessThan (root .get (key ), (Date ) value );
143
+ }
144
+ }
145
+
146
+ if (filter .isLessThanEqual ()) {
147
+ Object value = filter .getValue ()[0 ];
148
+ if (value instanceof Integer ) {
149
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value );
150
+ }
151
+ if (value instanceof Long ) {
152
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value );
153
+ }
154
+ if (value instanceof Date ) {
155
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Date ) value );
156
+ }
157
+ }
158
+
159
+ if (filter .isIn ()) {
160
+ Object [] value = filter .getValue ();
161
+ CriteriaBuilder .In <Object > in = criteriaBuilder .in (root .get (key ));
162
+ for (Object item : value ) {
163
+ in .value (item );
164
+ }
165
+ return in ;
166
+ }
167
+
168
+ if (filter .isOr ()) {
169
+ Filter [] orFilters = (Filter []) filter .getValue ();
170
+ List <Predicate > orPredicates = new ArrayList <>();
171
+ for (Filter orFilter : orFilters ) {
172
+ orPredicates .add (toPredicate (orFilter , criteriaBuilder , root , properties ));
173
+ }
174
+ return criteriaBuilder .or (orPredicates .toArray (new Predicate [0 ]));
175
+ }
176
+ }
177
+ return null ;
178
+ }
179
+
180
+
73
181
public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
74
182
List <Predicate > predicates = new ArrayList <>();
75
183
List <String > properties = getClazzProperties ();
76
- for (String key : request .getFilters ().keySet ()) {
77
- PageRequest .Filter filter = request .getFilters ().get (key );
78
- if (filter .isOr () || properties .contains (key )) {
79
- if (filter .isEqual ()) {
80
- predicates .add (criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]));
81
- }
82
-
83
- if (filter .isLike ()) {
84
- String matchValue = (String ) filter .getValue ()[0 ];
85
- predicates .add (criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" ));
86
- }
87
-
88
- if (filter .isBetween ()) {
89
- Object value1 = filter .getValue ()[0 ];
90
- Object value2 = filter .getValue ()[2 ];
91
- if (value1 instanceof Integer && value2 instanceof Integer ) {
92
- predicates .add (criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 ));
93
- }
94
-
95
- if (value1 instanceof Long && value2 instanceof Long ) {
96
- predicates .add (criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 ));
97
- }
98
-
99
- if (value1 instanceof Date && value2 instanceof Date ) {
100
- predicates .add (criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 ));
101
- }
102
- }
103
-
104
- if (filter .isGreaterThan ()) {
105
- Object value = filter .getValue ()[0 ];
106
- if (value instanceof Integer ) {
107
- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Integer ) value ));
108
- }
109
- if (value instanceof Long ) {
110
- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Long ) value ));
111
- }
112
- if (value instanceof Date ) {
113
- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Date ) value ));
114
- }
115
- }
116
-
117
- if (filter .isGreaterThanEqual ()) {
118
- Object value = filter .getValue ()[0 ];
119
- if (value instanceof Integer ) {
120
- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value ));
121
- }
122
- if (value instanceof Long ) {
123
- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value ));
124
- }
125
- if (value instanceof Date ) {
126
- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value ));
127
- }
128
- }
129
-
130
- if (filter .isLessThan ()) {
131
- Object value = filter .getValue ()[0 ];
132
- if (value instanceof Integer ) {
133
- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Integer ) value ));
134
- }
135
- if (value instanceof Long ) {
136
- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Long ) value ));
137
- }
138
- if (value instanceof Date ) {
139
- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Date ) value ));
140
- }
141
- }
142
-
143
- if (filter .isLessThanEqual ()) {
144
- Object value = filter .getValue ()[0 ];
145
- if (value instanceof Integer ) {
146
- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value ));
147
- }
148
- if (value instanceof Long ) {
149
- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value ));
150
- }
151
- if (value instanceof Date ) {
152
- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Date ) value ));
153
- }
154
- }
155
-
156
- if (filter .isIn ()) {
157
- Object [] value = filter .getValue ();
158
- predicates .add (criteriaBuilder .in (root .get (key )).value (value ));
159
- }
160
-
161
- if (filter .isOr ()) {
162
- if (key .equals ("OR" )) {
163
- Object [] value = filter .getValue ();
164
-
165
- // 创建Predicate的列表,用于收集所有的OR条件
166
- List <Predicate > orPredicates = new ArrayList <>();
167
-
168
- // 循环遍历value数组,每两个为一组
169
- for (int i = 0 ; i < value .length ; i += 2 ) {
170
- orPredicates .add (criteriaBuilder .equal (root .get ((String ) value [i ]), value [i + 1 ]));
171
- }
172
-
173
- // 使用or方法连接所有的Predicate
174
- predicates .add (criteriaBuilder .or (orPredicates .toArray (new Predicate [0 ])));
175
- }else {
176
- Object [] value = filter .getValue ();
177
- predicates .add (criteriaBuilder .equal (root .get (key ), value [0 ]));
178
- }
179
- }
184
+ RequestFilter requestFilter = request .getRequestFilter ();
185
+ for (Filter filter : requestFilter .getFilters ()) {
186
+ Predicate predicate = toPredicate (filter , criteriaBuilder , root , properties );
187
+ if (predicate != null ) {
188
+ predicates .add (predicate );
180
189
}
181
190
}
182
-
183
191
return predicates ;
184
192
}
185
193
}
0 commit comments