11package com .codingapi .springboot .fast .query ;
22
3+ import com .codingapi .springboot .framework .dto .request .Filter ;
34import com .codingapi .springboot .framework .dto .request .PageRequest ;
5+ import com .codingapi .springboot .framework .dto .request .RequestFilter ;
46import jakarta .persistence .criteria .CriteriaBuilder ;
57import jakarta .persistence .criteria .Order ;
68import jakarta .persistence .criteria .Predicate ;
@@ -24,7 +26,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
2426 }
2527
2628 public <T > Example <T > getExample () {
27- if (!request .hasFilter ()) {
29+ RequestFilter requestFilter = request .getRequestFilter ();
30+ if (!requestFilter .hasFilter ()) {
2831 return null ;
2932 }
3033 Object entity = null ;
@@ -36,7 +39,7 @@ public <T> Example<T> getExample() {
3639 PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
3740 for (PropertyDescriptor descriptor : descriptors ) {
3841 String name = descriptor .getName ();
39- PageRequest . Filter value = request . getFilters (). get (name );
42+ Filter value = requestFilter . getFilter (name );
4043 if (value != null ) {
4144 try {
4245 descriptor .getWriteMethod ().invoke (entity , value .getFilterValue (descriptor .getPropertyType ()));
@@ -70,116 +73,120 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
7073 return orderList ;
7174 }
7275
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+
73180 public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
74181 List <Predicate > predicates = new ArrayList <>();
75182 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 );
180188 }
181189 }
182-
183190 return predicates ;
184191 }
185192}
0 commit comments