1+ package com .codingapi .springboot .fast .query ;
2+
3+ import com .codingapi .springboot .framework .dto .request .PageRequest ;
4+ import javax .persistence .criteria .CriteriaBuilder ;
5+ import javax .persistence .criteria .Order ;
6+ import javax .persistence .criteria .Predicate ;
7+ import javax .persistence .criteria .Root ;
8+ import org .springframework .beans .BeanUtils ;
9+ import org .springframework .data .domain .Example ;
10+
11+ import java .beans .PropertyDescriptor ;
12+ import java .util .ArrayList ;
13+ import java .util .Date ;
14+ import java .util .List ;
15+
16+ public class QueryRequest {
17+
18+ private final PageRequest request ;
19+ private final Class <?> clazz ;
20+
21+ public QueryRequest (PageRequest request , Class <?> clazz ) {
22+ this .request = request ;
23+ this .clazz = clazz ;
24+ }
25+
26+ public <T > Example <T > getExample () {
27+ if (!request .hasFilter ()) {
28+ return null ;
29+ }
30+ Object entity = null ;
31+ try {
32+ entity = clazz .getDeclaredConstructor ().newInstance ();
33+ } catch (Exception e ) {
34+ throw new RuntimeException (e );
35+ }
36+ PropertyDescriptor [] descriptors = BeanUtils .getPropertyDescriptors (clazz );
37+ for (PropertyDescriptor descriptor : descriptors ) {
38+ String name = descriptor .getName ();
39+ PageRequest .Filter value = request .getFilters ().get (name );
40+ if (value != null ) {
41+ try {
42+ descriptor .getWriteMethod ().invoke (entity , value .getFilterValue (descriptor .getPropertyType ()));
43+ } catch (Exception e ) {
44+ }
45+ }
46+ }
47+ return (Example <T >) Example .of (entity );
48+ }
49+
50+
51+ public <T > List <Order > getOrder (Root <T > root , CriteriaBuilder criteriaBuilder ) {
52+ List <Order > orderList = new ArrayList <>();
53+ request .getSort ().forEach (sort -> {
54+ if (sort .getDirection ().isAscending ()) {
55+ orderList .add (criteriaBuilder .asc (root .get (sort .getProperty ())));
56+ } else {
57+ orderList .add (criteriaBuilder .asc (root .get (sort .getProperty ())));
58+ }
59+ });
60+ return orderList ;
61+ }
62+
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 );
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 ));
141+ }
142+ }
143+ }
144+
145+ return predicates ;
146+ }
147+ }
0 commit comments