Skip to content

Commit eb64853

Browse files
committed
add findAllByRequest
1 parent 9c0b4ac commit eb64853

File tree

5 files changed

+269
-43
lines changed

5 files changed

+269
-43
lines changed
Lines changed: 115 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
package com.codingapi.springboot.fast.query;
22

33
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import jakarta.persistence.criteria.Predicate;
45
import org.springframework.core.ResolvableType;
56
import org.springframework.data.domain.Page;
7+
import org.springframework.data.jpa.domain.Specification;
68
import org.springframework.data.jpa.repository.JpaRepository;
79
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
810
import org.springframework.data.repository.NoRepositoryBean;
911

12+
import java.util.ArrayList;
13+
import java.util.Date;
14+
import java.util.List;
15+
1016
@NoRepositoryBean
11-
public interface FastRepository<T,ID> extends JpaRepository<T,ID>, JpaSpecificationExecutor<T> {
17+
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
1218

13-
default Page<T> findAll(PageRequest request){
14-
if(request.hasFilter()){
19+
default Page<T> findAll(PageRequest request) {
20+
if (request.hasFilter()) {
1521
Class<T> clazz = getDomainClass();
16-
return findAll(request.getExample(clazz),request);
22+
QueryRequest queryRequest = new QueryRequest(request);
23+
return findAll(queryRequest.getExample(clazz), request);
1724
}
18-
return findAll((org.springframework.data.domain.PageRequest)request);
25+
return findAll((org.springframework.data.domain.PageRequest) request);
1926
}
2027

2128

@@ -25,4 +32,107 @@ default Class<T> getDomainClass() {
2532
return (Class<T>) resolvableType.getGeneric(0).resolve();
2633
}
2734

35+
36+
default Page<T> findAllByRequest(PageRequest request) {
37+
if (request.hasFilter()) {
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+
130+
return query.where(predicates.toArray(new Predicate[0])).orderBy(orderList).getRestriction();
131+
};
132+
133+
return findAll(specification, request);
134+
}
135+
return findAll((org.springframework.data.domain.PageRequest) request);
136+
}
137+
28138
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.codingapi.springboot.fast.query;
2+
3+
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import org.springframework.beans.BeanUtils;
5+
import org.springframework.data.domain.Example;
6+
7+
import java.beans.PropertyDescriptor;
8+
9+
public class QueryRequest {
10+
11+
private final PageRequest request;
12+
13+
public QueryRequest(PageRequest request) {
14+
this.request = request;
15+
}
16+
17+
public <T> Example<T> getExample(Class<T> clazz) {
18+
if (!request.hasFilter()) {
19+
return null;
20+
}
21+
Object entity = null;
22+
try {
23+
entity = clazz.getDeclaredConstructor().newInstance();
24+
} catch (Exception e) {
25+
throw new RuntimeException(e);
26+
}
27+
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
28+
for (PropertyDescriptor descriptor : descriptors) {
29+
String name = descriptor.getName();
30+
PageRequest.Filter value = request.getFilters().get(name);
31+
if (value != null) {
32+
try {
33+
descriptor.getWriteMethod().invoke(entity, value.getValue()[0]);
34+
} catch (Exception e) {
35+
}
36+
}
37+
}
38+
return (Example<T>) Example.of(entity);
39+
}
40+
}

springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,28 @@ void query(){
5050
}
5151

5252

53+
@Test
54+
void queryByRequest(){
55+
demoRepository.deleteAll();
56+
Demo demo1 = new Demo();
57+
demo1.setName("1234");
58+
demoRepository.save(demo1);
59+
60+
Demo demo2 = new Demo();
61+
demo2.setName("4567");
62+
demoRepository.save(demo2);
63+
64+
PageRequest request = new PageRequest();
65+
request.setCurrent(1);
66+
request.setPageSize(10);
67+
request.addFilter("name","1234");
68+
request.addFilter("id", PageRequest.FilterRelation.LESS_THAN_EQUAL,10);
69+
70+
Page<Demo> page = demoRepository.findAllByRequest(request);
71+
assertEquals(1, page.getTotalElements());
72+
}
73+
74+
5375
@Test
5476
void sort(){
5577
demoRepository.deleteAll();

springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java

Lines changed: 89 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22

33
import jakarta.servlet.http.HttpServletRequest;
44
import lombok.Getter;
5-
import org.springframework.beans.BeanUtils;
6-
import org.springframework.data.domain.Example;
5+
import lombok.Setter;
76
import org.springframework.data.domain.Pageable;
87
import org.springframework.data.domain.Sort;
98
import org.springframework.util.StringUtils;
109
import org.springframework.web.context.request.RequestContextHolder;
1110
import org.springframework.web.context.request.ServletRequestAttributes;
1211

13-
import java.beans.PropertyDescriptor;
1412
import java.util.Enumeration;
1513
import java.util.HashMap;
1614
import java.util.Map;
@@ -22,7 +20,8 @@ public class PageRequest extends org.springframework.data.domain.PageRequest {
2220
private int current;
2321
private int pageSize;
2422

25-
private final Map<String, Object> filters = new HashMap<>();
23+
@Getter
24+
private final Map<String, Filter> filters = new HashMap<>();
2625

2726
@Getter
2827
private HttpServletRequest servletRequest;
@@ -50,7 +49,7 @@ private void syncParameter() {
5049
String key = enumeration.nextElement();
5150
String value = servletRequest.getParameter(key);
5251
if (StringUtils.hasText(value)) {
53-
this.filters.put(key, value);
52+
addFilter(key, value);
5453
}
5554
}
5655
}
@@ -81,26 +80,41 @@ public int getIntParameter(String key, int defaultValue) {
8180
return result == null ? defaultValue : Integer.parseInt(result);
8281
}
8382

84-
public Map<String, Object> getFilters() {
85-
return filters;
86-
}
8783

8884
public String getStringFilter(String key) {
89-
return (String) filters.get(key);
85+
Filter filter = (Filter) filters.get(key);
86+
if (filter != null) {
87+
return (String) filter.getValue()[0];
88+
}
89+
return null;
9090
}
9191

9292
public String getStringFilter(String key, String defaultValue) {
93-
String result = (String) filters.get(key);
94-
return result == null ? defaultValue : result;
93+
String value = getStringFilter(key);
94+
if (!StringUtils.hasText(value)) {
95+
return defaultValue;
96+
}
97+
return value;
9598
}
9699

97100
public int getIntFilter(String key) {
98-
return Integer.parseInt((String) filters.get(key));
101+
Filter filter = (Filter) filters.get(key);
102+
if (filter != null) {
103+
String value = (String) filter.getValue()[0];
104+
if (StringUtils.hasText(value)) {
105+
return Integer.parseInt(value);
106+
}
107+
return 0;
108+
}
109+
return 0;
99110
}
100111

101112
public int getIntFilter(String key, int defaultValue) {
102-
String result = (String) filters.get(key);
103-
return result == null ? defaultValue : Integer.parseInt(result);
113+
int value = getIntFilter(key);
114+
if (value == 0) {
115+
return defaultValue;
116+
}
117+
return value;
104118
}
105119

106120

@@ -182,38 +196,78 @@ public void addSort(Sort sort) {
182196
}
183197
}
184198

185-
public PageRequest addFilter(String key, Object value) {
186-
this.filters.put(key, value);
199+
public PageRequest addFilter(String key, FilterRelation relation, Object... value) {
200+
putFilter(key, relation, value);
187201
return this;
188202
}
189203

204+
public PageRequest addFilter(String key, Object... value) {
205+
return this.addFilter(key, FilterRelation.EUQAL, value);
206+
}
207+
190208
public boolean hasFilter() {
191209
return !this.filters.isEmpty();
192210
}
193211

194-
public <T> Example<T> getExample(Class<T> clazz) {
195-
if (!hasFilter()) {
196-
return null;
212+
@Setter
213+
@Getter
214+
public static class Filter {
215+
private String key;
216+
private Object[] value;
217+
218+
private FilterRelation relation;
219+
220+
public boolean isEqual() {
221+
return relation == FilterRelation.EUQAL;
197222
}
198-
Object entity = null;
199-
try {
200-
entity = clazz.getDeclaredConstructor().newInstance();
201-
} catch (Exception e) {
202-
throw new RuntimeException(e);
223+
224+
public boolean isLike() {
225+
return relation == FilterRelation.LIKE;
203226
}
204-
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
205-
for (PropertyDescriptor descriptor : descriptors) {
206-
String name = descriptor.getName();
207-
Object value = filters.get(name);
208-
if (value != null) {
209-
try {
210-
descriptor.getWriteMethod().invoke(entity, value);
211-
} catch (Exception e) {
212-
}
213-
}
227+
228+
public boolean isBetween() {
229+
return relation == FilterRelation.BETWEEN;
230+
}
231+
232+
public boolean isIn() {
233+
return relation == FilterRelation.IN;
234+
}
235+
236+
public boolean isGreaterThan() {
237+
return relation == FilterRelation.GREATER_THAN;
238+
}
239+
240+
public boolean isLessThan() {
241+
return relation == FilterRelation.LESS_THAN;
214242
}
215-
return (Example<T>) Example.of(entity);
216243

244+
public boolean isGreaterThanEqual() {
245+
return relation == FilterRelation.GREATER_THAN_EQUAL;
246+
}
247+
248+
public boolean isLessThanEqual() {
249+
return relation == FilterRelation.LESS_THAN_EQUAL;
250+
}
251+
252+
}
253+
254+
private void putFilter(String key, FilterRelation relation, Object... val) {
255+
Filter filter = new Filter();
256+
filter.setKey(key);
257+
filter.setValue(val);
258+
filter.setRelation(relation);
259+
this.filters.put(key, filter);
260+
}
261+
262+
public enum FilterRelation {
263+
EUQAL,
264+
LIKE,
265+
BETWEEN,
266+
IN,
267+
GREATER_THAN,
268+
LESS_THAN,
269+
GREATER_THAN_EQUAL,
270+
LESS_THAN_EQUAL,
217271
}
218272
}
219273

0 commit comments

Comments
 (0)