11package com .codingapi .springboot .fast .query ;
22
3- import com .codingapi .springboot .framework .dto .request .PageRequest ;
4- import org .springframework .beans .BeanUtils ;
5- import org .springframework .data .domain .Example ;
63
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 ;
77import javax .persistence .criteria .CriteriaBuilder ;
88import javax .persistence .criteria .Order ;
99import javax .persistence .criteria .Predicate ;
1010import javax .persistence .criteria .Root ;
11+ import org .springframework .beans .BeanUtils ;
12+ import org .springframework .data .domain .Example ;
13+
1114import java .beans .PropertyDescriptor ;
1215import java .util .ArrayList ;
1316import java .util .Date ;
@@ -24,7 +27,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
2427 }
2528
2629 public <T > Example <T > getExample () {
27- if (!request .hasFilter ()) {
30+ RequestFilter requestFilter = request .getRequestFilter ();
31+ if (!requestFilter .hasFilter ()) {
2832 return null ;
2933 }
3034 Object entity = null ;
@@ -36,7 +40,7 @@ public <T> Example<T> getExample() {
3640 PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
3741 for (PropertyDescriptor descriptor : descriptors ) {
3842 String name = descriptor .getName ();
39- PageRequest . Filter value = request . getFilters (). get (name );
43+ Filter value = requestFilter . getFilter (name );
4044 if (value != null ) {
4145 try {
4246 descriptor .getWriteMethod ().invoke (entity , value .getFilterValue (descriptor .getPropertyType ()));
@@ -70,116 +74,120 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
7074 return orderList ;
7175 }
7276
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+
73181 public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
74182 List <Predicate > predicates = new ArrayList <>();
75183 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 );
180189 }
181190 }
182-
183191 return predicates ;
184192 }
185193}
0 commit comments