Skip to content

Commit 80e580d

Browse files
committed
add findAllByRequest
1 parent eb64853 commit 80e580d

File tree

2 files changed

+116
-97
lines changed

2 files changed

+116
-97
lines changed

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java

+7-95
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.codingapi.springboot.fast.query;
22

33
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import jakarta.persistence.criteria.Order;
45
import jakarta.persistence.criteria.Predicate;
56
import org.springframework.core.ResolvableType;
67
import org.springframework.data.domain.Page;
@@ -9,8 +10,6 @@
910
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
1011
import org.springframework.data.repository.NoRepositoryBean;
1112

12-
import java.util.ArrayList;
13-
import java.util.Date;
1413
import 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

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java

+109-2
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
11
package com.codingapi.springboot.fast.query;
22

33
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import jakarta.persistence.criteria.CriteriaBuilder;
5+
import jakarta.persistence.criteria.Order;
6+
import jakarta.persistence.criteria.Predicate;
7+
import jakarta.persistence.criteria.Root;
48
import org.springframework.beans.BeanUtils;
59
import org.springframework.data.domain.Example;
610

711
import java.beans.PropertyDescriptor;
12+
import java.util.ArrayList;
13+
import java.util.Date;
14+
import java.util.List;
815

916
public class QueryRequest {
1017

1118
private final PageRequest request;
19+
private final Class<?> clazz;
1220

13-
public QueryRequest(PageRequest request) {
21+
public QueryRequest(PageRequest request, Class<?> clazz) {
1422
this.request = request;
23+
this.clazz = clazz;
1524
}
1625

17-
public <T> Example<T> getExample(Class<T> clazz) {
26+
public <T> Example<T> getExample() {
1827
if (!request.hasFilter()) {
1928
return null;
2029
}
@@ -37,4 +46,102 @@ public <T> Example<T> getExample(Class<T> clazz) {
3746
}
3847
return (Example<T>) Example.of(entity);
3948
}
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+
}
40147
}

0 commit comments

Comments
 (0)