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 ()));
@@ -70,116 +73,120 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
70
73
return orderList ;
71
74
}
72
75
76
+
77
+ private <T > Predicate toPredicate (Filter filter , CriteriaBuilder criteriaBuilder , Root <T > root , List <String > properties ) {
78
+ String key = filter .getKey ();
79
+ if (filter .isOr () || properties .contains (key )) {
80
+
81
+ if (filter .isEqual ()) {
82
+ return criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]);
83
+ }
84
+
85
+ if (filter .isLike ()) {
86
+ String matchValue = (String ) filter .getValue ()[0 ];
87
+ return criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" );
88
+ }
89
+
90
+ if (filter .isBetween ()) {
91
+ Object value1 = filter .getValue ()[0 ];
92
+ Object value2 = filter .getValue ()[2 ];
93
+ if (value1 instanceof Integer && value2 instanceof Integer ) {
94
+ return criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 );
95
+ }
96
+
97
+ if (value1 instanceof Long && value2 instanceof Long ) {
98
+ return criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 );
99
+ }
100
+
101
+ if (value1 instanceof Date && value2 instanceof Date ) {
102
+ return criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 );
103
+ }
104
+ }
105
+
106
+ if (filter .isGreaterThan ()) {
107
+ Object value = filter .getValue ()[0 ];
108
+ if (value instanceof Integer ) {
109
+ return criteriaBuilder .greaterThan (root .get (key ), (Integer ) value );
110
+ }
111
+ if (value instanceof Long ) {
112
+ return criteriaBuilder .greaterThan (root .get (key ), (Long ) value );
113
+ }
114
+ if (value instanceof Date ) {
115
+ return criteriaBuilder .greaterThan (root .get (key ), (Date ) value );
116
+ }
117
+ }
118
+
119
+ if (filter .isGreaterThanEqual ()) {
120
+ Object value = filter .getValue ()[0 ];
121
+ if (value instanceof Integer ) {
122
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value );
123
+ }
124
+ if (value instanceof Long ) {
125
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value );
126
+ }
127
+ if (value instanceof Date ) {
128
+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value );
129
+ }
130
+ }
131
+
132
+ if (filter .isLessThan ()) {
133
+ Object value = filter .getValue ()[0 ];
134
+ if (value instanceof Integer ) {
135
+ return criteriaBuilder .lessThan (root .get (key ), (Integer ) value );
136
+ }
137
+ if (value instanceof Long ) {
138
+ return criteriaBuilder .lessThan (root .get (key ), (Long ) value );
139
+ }
140
+ if (value instanceof Date ) {
141
+ return criteriaBuilder .lessThan (root .get (key ), (Date ) value );
142
+ }
143
+ }
144
+
145
+ if (filter .isLessThanEqual ()) {
146
+ Object value = filter .getValue ()[0 ];
147
+ if (value instanceof Integer ) {
148
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value );
149
+ }
150
+ if (value instanceof Long ) {
151
+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value );
152
+ }
153
+ if (value instanceof Date ) {
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 );
163
+ }
164
+ return in ;
165
+ }
166
+
167
+ if (filter .isOr ()) {
168
+ Filter [] orFilters = (Filter []) filter .getValue ();
169
+ List <Predicate > orPredicates = new ArrayList <>();
170
+ for (Filter orFilter : orFilters ) {
171
+ orPredicates .add (toPredicate (orFilter , criteriaBuilder , root , properties ));
172
+ }
173
+ return criteriaBuilder .or (orPredicates .toArray (new Predicate [0 ]));
174
+ }
175
+ }
176
+ return null ;
177
+ }
178
+
179
+
73
180
public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
74
181
List <Predicate > predicates = new ArrayList <>();
75
182
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
- }
183
+ RequestFilter requestFilter = request .getRequestFilter ();
184
+ for (Filter filter : requestFilter .getFilters ()) {
185
+ Predicate predicate = toPredicate (filter , criteriaBuilder , root , properties );
186
+ if (predicate != null ) {
187
+ predicates .add (predicate );
180
188
}
181
189
}
182
-
183
190
return predicates ;
184
191
}
185
192
}
0 commit comments