11package com .codingapi .springboot .fast .query ;
22
33import com .codingapi .springboot .framework .dto .request .PageRequest ;
4+ import org .springframework .beans .BeanUtils ;
5+ import org .springframework .data .domain .Example ;
6+
47import javax .persistence .criteria .CriteriaBuilder ;
58import javax .persistence .criteria .Order ;
69import javax .persistence .criteria .Predicate ;
710import javax .persistence .criteria .Root ;
8- import org .springframework .beans .BeanUtils ;
9- import org .springframework .data .domain .Example ;
10-
1111import java .beans .PropertyDescriptor ;
1212import java .util .ArrayList ;
1313import java .util .Date ;
@@ -48,6 +48,16 @@ public <T> Example<T> getExample() {
4848 }
4949
5050
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+
5161 public <T > List <Order > getOrder (Root <T > root , CriteriaBuilder criteriaBuilder ) {
5262 List <Order > orderList = new ArrayList <>();
5363 request .getSort ().forEach (sort -> {
@@ -62,82 +72,110 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
6272
6373 public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
6474 List <Predicate > predicates = new ArrayList <>();
75+ List <String > properties = getClazzProperties ();
6576 for (String key : request .getFilters ().keySet ()) {
6677 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+ }
141179 }
142180 }
143181 }
0 commit comments