11package com .codingapi .springboot .fast .query ;
22
33import com .codingapi .springboot .framework .dto .request .PageRequest ;
4+ import jakarta .persistence .criteria .Order ;
45import jakarta .persistence .criteria .Predicate ;
56import org .springframework .core .ResolvableType ;
67import org .springframework .data .domain .Page ;
910import org .springframework .data .jpa .repository .JpaSpecificationExecutor ;
1011import org .springframework .data .repository .NoRepositoryBean ;
1112
12- import java .util .ArrayList ;
13- import java .util .Date ;
1413import java .util .List ;
1514
1615@ NoRepositoryBean
@@ -19,8 +18,8 @@ public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecific
1918 default Page <T > findAll (PageRequest request ) {
2019 if (request .hasFilter ()) {
2120 Class <T > clazz = getDomainClass ();
22- QueryRequest queryRequest = new QueryRequest (request );
23- return findAll (queryRequest .getExample (clazz ), request );
21+ QueryRequest queryRequest = new QueryRequest (request , clazz );
22+ return findAll (queryRequest .getExample (), request );
2423 }
2524 return findAll ((org .springframework .data .domain .PageRequest ) request );
2625 }
@@ -35,98 +34,11 @@ default Class<T> getDomainClass() {
3534
3635 default Page <T > findAllByRequest (PageRequest request ) {
3736 if (request .hasFilter ()) {
37+ Class <T > clazz = getDomainClass ();
3838 Specification <T > specification = (root , query , criteriaBuilder ) -> {
39-
40- List <Predicate > predicates = new ArrayList <>();
41- for (String key : request .getFilters ().keySet ()) {
42- PageRequest .Filter filter = request .getFilters ().get (key );
43- if (filter .isEqual ()) {
44- predicates .add (criteriaBuilder .equal (root .get (key ), filter .getValue ()[0 ]));
45- }
46-
47- if (filter .isLike ()) {
48- String matchValue = (String ) filter .getValue ()[0 ];
49- predicates .add (criteriaBuilder .like (root .get (key ), "%" + matchValue + "%" ));
50- }
51-
52- if (filter .isBetween ()) {
53- Object value1 = filter .getValue ()[0 ];
54- Object value2 = filter .getValue ()[2 ];
55- if (value1 instanceof Integer && value2 instanceof Integer ) {
56- predicates .add (criteriaBuilder .between (root .get (key ), (Integer ) value1 , (Integer ) value2 ));
57- }
58-
59- if (value1 instanceof Long && value2 instanceof Long ) {
60- predicates .add (criteriaBuilder .between (root .get (key ), (Long ) value1 , (Long ) value2 ));
61- }
62-
63- if (value1 instanceof Date && value2 instanceof Date ) {
64- predicates .add (criteriaBuilder .between (root .get (key ), (Date ) value1 , (Date ) value2 ));
65- }
66- }
67-
68- if (filter .isGreaterThan ()) {
69- Object value = filter .getValue ()[0 ];
70- if (value instanceof Integer ) {
71- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Integer ) value ));
72- }
73- if (value instanceof Long ) {
74- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Long ) value ));
75- }
76- if (value instanceof Date ) {
77- predicates .add (criteriaBuilder .greaterThan (root .get (key ), (Date ) value ));
78- }
79- }
80-
81- if (filter .isGreaterThanEqual ()) {
82- Object value = filter .getValue ()[0 ];
83- if (value instanceof Integer ) {
84- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Integer ) value ));
85- }
86- if (value instanceof Long ) {
87- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Long ) value ));
88- }
89- if (value instanceof Date ) {
90- predicates .add (criteriaBuilder .greaterThanOrEqualTo (root .get (key ), (Date ) value ));
91- }
92- }
93-
94- if (filter .isLessThan ()) {
95- Object value = filter .getValue ()[0 ];
96- if (value instanceof Integer ) {
97- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Integer ) value ));
98- }
99- if (value instanceof Long ) {
100- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Long ) value ));
101- }
102- if (value instanceof Date ) {
103- predicates .add (criteriaBuilder .lessThan (root .get (key ), (Date ) value ));
104- }
105- }
106-
107- if (filter .isLessThanEqual ()) {
108- Object value = filter .getValue ()[0 ];
109- if (value instanceof Integer ) {
110- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Integer ) value ));
111- }
112- if (value instanceof Long ) {
113- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Long ) value ));
114- }
115- if (value instanceof Date ) {
116- predicates .add (criteriaBuilder .lessThanOrEqualTo (root .get (key ), (Date ) value ));
117- }
118- }
119- }
120-
121- List <jakarta .persistence .criteria .Order > orderList = new ArrayList <>();
122- request .getSort ().forEach (sort -> {
123- if (sort .getDirection ().isAscending ()) {
124- orderList .add (criteriaBuilder .asc (root .get (sort .getProperty ())));
125- } else {
126- orderList .add (criteriaBuilder .asc (root .get (sort .getProperty ())));
127- }
128- });
129-
39+ QueryRequest queryRequest = new QueryRequest (request , clazz );
40+ List <Predicate > predicates = queryRequest .getPredicate (root , criteriaBuilder );
41+ List <Order > orderList = queryRequest .getOrder (root , criteriaBuilder );
13042 return query .where (predicates .toArray (new Predicate [0 ])).orderBy (orderList ).getRestriction ();
13143 };
13244
0 commit comments