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 ()));
@@ -48,6 +51,16 @@ public <T> Example<T> getExample() {
4851 }
4952
5053
54+ private List <String > getClazzProperties () {
55+ List <String > properties = new ArrayList <>();
56+ PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
57+ for (PropertyDescriptor descriptor : descriptors ) {
58+ properties .add (descriptor .getName ());
59+ }
60+ return properties ;
61+ }
62+
63+
5164 public <T > List <Order > getOrder (Root <T > root , CriteriaBuilder criteriaBuilder ) {
5265 List <Order > orderList = new ArrayList <>();
5366 request .getSort ().forEach (sort -> {
@@ -60,88 +73,135 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
6073 return orderList ;
6174 }
6275
63- public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
64- List <Predicate > predicates = new ArrayList <>();
65- for (String key : request .getFilters ().keySet ()) {
66- PageRequest .Filter filter = request .getFilters ().get (key );
76+
77+ private <T > Predicate toPredicate (Filter filter , CriteriaBuilder criteriaBuilder , Root <T > root , List <String > properties ) {
78+ String key = filter .getKey ();
79+ if (filter .isAndFilters () || filter .isOrFilters () || properties .contains (key )) {
80+
6781 if (filter .isEqual ()) {
68- predicates . add ( criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]) );
82+ return criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]);
6983 }
7084
7185 if (filter .isLike ()) {
7286 String matchValue = (String ) filter .getValue ()[0 ];
73- predicates . add ( criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" ) );
87+ return criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" );
7488 }
7589
7690 if (filter .isBetween ()) {
7791 Object value1 = filter .getValue ()[0 ];
7892 Object value2 = filter .getValue ()[2 ];
7993 if (value1 instanceof Integer && value2 instanceof Integer ) {
80- predicates . add ( criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 ) );
94+ return criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 );
8195 }
8296
8397 if (value1 instanceof Long && value2 instanceof Long ) {
84- predicates . add ( criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 ) );
98+ return criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 );
8599 }
86100
87101 if (value1 instanceof Date && value2 instanceof Date ) {
88- predicates . add ( criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 ) );
102+ return criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 );
89103 }
90104 }
91105
92106 if (filter .isGreaterThan ()) {
93107 Object value = filter .getValue ()[0 ];
94108 if (value instanceof Integer ) {
95- predicates . add ( criteriaBuilder .greaterThan (root .get (key ), (Integer ) value ) );
109+ return criteriaBuilder .greaterThan (root .get (key ), (Integer ) value );
96110 }
97111 if (value instanceof Long ) {
98- predicates . add ( criteriaBuilder .greaterThan (root .get (key ), (Long ) value ) );
112+ return criteriaBuilder .greaterThan (root .get (key ), (Long ) value );
99113 }
100114 if (value instanceof Date ) {
101- predicates . add ( criteriaBuilder .greaterThan (root .get (key ), (Date ) value ) );
115+ return criteriaBuilder .greaterThan (root .get (key ), (Date ) value );
102116 }
103117 }
104118
105119 if (filter .isGreaterThanEqual ()) {
106120 Object value = filter .getValue ()[0 ];
107121 if (value instanceof Integer ) {
108- predicates . add ( criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value ) );
122+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value );
109123 }
110124 if (value instanceof Long ) {
111- predicates . add ( criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value ) );
125+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value );
112126 }
113127 if (value instanceof Date ) {
114- predicates . add ( criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value ) );
128+ return criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value );
115129 }
116130 }
117131
118132 if (filter .isLessThan ()) {
119133 Object value = filter .getValue ()[0 ];
120134 if (value instanceof Integer ) {
121- predicates . add ( criteriaBuilder .lessThan (root .get (key ), (Integer ) value ) );
135+ return criteriaBuilder .lessThan (root .get (key ), (Integer ) value );
122136 }
123137 if (value instanceof Long ) {
124- predicates . add ( criteriaBuilder .lessThan (root .get (key ), (Long ) value ) );
138+ return criteriaBuilder .lessThan (root .get (key ), (Long ) value );
125139 }
126140 if (value instanceof Date ) {
127- predicates . add ( criteriaBuilder .lessThan (root .get (key ), (Date ) value ) );
141+ return criteriaBuilder .lessThan (root .get (key ), (Date ) value );
128142 }
129143 }
130144
131145 if (filter .isLessThanEqual ()) {
132146 Object value = filter .getValue ()[0 ];
133147 if (value instanceof Integer ) {
134- predicates . add ( criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value ) );
148+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value );
135149 }
136150 if (value instanceof Long ) {
137- predicates . add ( criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value ) );
151+ return criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value );
138152 }
139153 if (value instanceof Date ) {
140- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Date ) value ));
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 );
141163 }
164+ return in ;
165+ }
166+
167+ if (filter .isOrFilters ()) {
168+ Filter [] orFilters = (Filter []) filter .getValue ();
169+ List <Predicate > orPredicates = new ArrayList <>();
170+ for (Filter orFilter : orFilters ) {
171+ Predicate predicate = toPredicate (orFilter , criteriaBuilder , root , properties );
172+ if (predicate != null ) {
173+ orPredicates .add (predicate );
174+ }
175+ }
176+ return criteriaBuilder .or (orPredicates .toArray (new Predicate [0 ]));
177+ }
178+
179+ if (filter .isAndFilters ()) {
180+ Filter [] orFilters = (Filter []) filter .getValue ();
181+ List <Predicate > addPredicates = new ArrayList <>();
182+ for (Filter orFilter : orFilters ) {
183+ Predicate predicate = toPredicate (orFilter , criteriaBuilder , root , properties );
184+ if (predicate != null ) {
185+ addPredicates .add (predicate );
186+ }
187+ }
188+ return criteriaBuilder .and (addPredicates .toArray (new Predicate [0 ]));
142189 }
143190 }
191+ return null ;
192+ }
193+
144194
195+ public <T > List <Predicate > getPredicate (Root <T > root , CriteriaBuilder criteriaBuilder ) {
196+ List <Predicate > predicates = new ArrayList <>();
197+ List <String > properties = getClazzProperties ();
198+ RequestFilter requestFilter = request .getRequestFilter ();
199+ for (Filter filter : requestFilter .getFilters ()) {
200+ Predicate predicate = toPredicate (filter , criteriaBuilder , root , properties );
201+ if (predicate != null ) {
202+ predicates .add (predicate );
203+ }
204+ }
145205 return predicates ;
146206 }
147- }
207+ }
0 commit comments