1
1
package com .codingapi .springboot .fast .query ;
2
2
3
3
import com .codingapi .springboot .framework .dto .request .PageRequest ;
4
+ import jakarta .persistence .criteria .Order ;
4
5
import jakarta .persistence .criteria .Predicate ;
5
6
import org .springframework .core .ResolvableType ;
6
7
import org .springframework .data .domain .Page ;
9
10
import org .springframework .data .jpa .repository .JpaSpecificationExecutor ;
10
11
import org .springframework .data .repository .NoRepositoryBean ;
11
12
12
- import java .util .ArrayList ;
13
- import java .util .Date ;
14
13
import java .util .List ;
15
14
16
15
@ NoRepositoryBean
@@ -19,8 +18,8 @@ public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecific
19
18
default Page <T > findAll (PageRequest request ) {
20
19
if (request .hasFilter ()) {
21
20
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 );
24
23
}
25
24
return findAll ((org .springframework .data .domain .PageRequest ) request );
26
25
}
@@ -35,98 +34,11 @@ default Class<T> getDomainClass() {
35
34
36
35
default Page <T > findAllByRequest (PageRequest request ) {
37
36
if (request .hasFilter ()) {
37
+ Class <T > clazz = getDomainClass ();
38
38
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 );
130
42
return query .where (predicates .toArray (new Predicate [0 ])).orderBy (orderList ).getRestriction ();
131
43
};
132
44
0 commit comments