1
1
package com .codingapi .springboot .fast .query ;
2
2
3
3
import com .codingapi .springboot .framework .dto .request .PageRequest ;
4
+ import org .springframework .beans .BeanUtils ;
5
+ import org .springframework .data .domain .Example ;
6
+
4
7
import javax .persistence .criteria .CriteriaBuilder ;
5
8
import javax .persistence .criteria .Order ;
6
9
import javax .persistence .criteria .Predicate ;
7
10
import javax .persistence .criteria .Root ;
8
- import org .springframework .beans .BeanUtils ;
9
- import org .springframework .data .domain .Example ;
10
-
11
11
import java .beans .PropertyDescriptor ;
12
12
import java .util .ArrayList ;
13
13
import java .util .Date ;
@@ -48,6 +48,16 @@ public <T> Example<T> getExample() {
48
48
}
49
49
50
50
51
+ private List <String > getClazzProperties () {
52
+ List <String > properties = new ArrayList <>();
53
+ PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
54
+ for (PropertyDescriptor descriptor : descriptors ) {
55
+ properties .add (descriptor .getName ());
56
+ }
57
+ return properties ;
58
+ }
59
+
60
+
51
61
public <T > List <Order > getOrder (Root <T > root , CriteriaBuilder criteriaBuilder ) {
52
62
List <Order > orderList = new ArrayList <>();
53
63
request .getSort ().forEach (sort -> {
@@ -62,82 +72,110 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
62
72
63
73
public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
64
74
List <Predicate > predicates = new ArrayList <>();
75
+ List <String > properties = getClazzProperties ();
65
76
for (String key : request .getFilters ().keySet ()) {
66
77
PageRequest .Filter filter = request .getFilters ().get (key );
67
- if (filter .isEqual ()) {
68
- predicates .add (criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]));
69
- }
70
-
71
- if (filter .isLike ()) {
72
- String matchValue = (String ) filter .getValue ()[0 ];
73
- predicates .add (criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" ));
74
- }
75
-
76
- if (filter .isBetween ()) {
77
- Object value1 = filter .getValue ()[0 ];
78
- Object value2 = filter .getValue ()[2 ];
79
- if (value1 instanceof Integer && value2 instanceof Integer ) {
80
- predicates .add (criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 ));
81
- }
82
-
83
- if (value1 instanceof Long && value2 instanceof Long ) {
84
- predicates .add (criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 ));
85
- }
86
-
87
- if (value1 instanceof Date && value2 instanceof Date ) {
88
- predicates .add (criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 ));
89
- }
90
- }
91
-
92
- if (filter .isGreaterThan ()) {
93
- Object value = filter .getValue ()[0 ];
94
- if (value instanceof Integer ) {
95
- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Integer ) value ));
96
- }
97
- if (value instanceof Long ) {
98
- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Long ) value ));
99
- }
100
- if (value instanceof Date ) {
101
- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Date ) value ));
102
- }
103
- }
104
-
105
- if (filter .isGreaterThanEqual ()) {
106
- Object value = filter .getValue ()[0 ];
107
- if (value instanceof Integer ) {
108
- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value ));
109
- }
110
- if (value instanceof Long ) {
111
- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value ));
112
- }
113
- if (value instanceof Date ) {
114
- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value ));
115
- }
116
- }
117
-
118
- if (filter .isLessThan ()) {
119
- Object value = filter .getValue ()[0 ];
120
- if (value instanceof Integer ) {
121
- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Integer ) value ));
122
- }
123
- if (value instanceof Long ) {
124
- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Long ) value ));
125
- }
126
- if (value instanceof Date ) {
127
- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Date ) value ));
128
- }
129
- }
130
-
131
- if (filter .isLessThanEqual ()) {
132
- Object value = filter .getValue ()[0 ];
133
- if (value instanceof Integer ) {
134
- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value ));
135
- }
136
- if (value instanceof Long ) {
137
- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value ));
138
- }
139
- if (value instanceof Date ) {
140
- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Date ) value ));
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
+ }
141
179
}
142
180
}
143
181
}
0 commit comments