Skip to content

Commit de19601

Browse files
committed
fix Filter
1 parent a037cdd commit de19601

File tree

6 files changed

+346
-258
lines changed

6 files changed

+346
-258
lines changed
Lines changed: 118 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.codingapi.springboot.fast.query;
22

3-
import com.codingapi.springboot.framework.dto.request.PageRequest;
4-
import org.springframework.beans.BeanUtils;
5-
import org.springframework.data.domain.Example;
63

4+
import com.codingapi.springboot.framework.dto.request.Filter;
5+
import com.codingapi.springboot.framework.dto.request.PageRequest;
6+
import com.codingapi.springboot.framework.dto.request.RequestFilter;
77
import javax.persistence.criteria.CriteriaBuilder;
88
import javax.persistence.criteria.Order;
99
import javax.persistence.criteria.Predicate;
1010
import javax.persistence.criteria.Root;
11+
import org.springframework.beans.BeanUtils;
12+
import org.springframework.data.domain.Example;
13+
1114
import java.beans.PropertyDescriptor;
1215
import java.util.ArrayList;
1316
import java.util.Date;
@@ -24,7 +27,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
2427
}
2528

2629
public <T> Example<T> getExample() {
27-
if (!request.hasFilter()) {
30+
RequestFilter requestFilter = request.getRequestFilter();
31+
if (!requestFilter.hasFilter()) {
2832
return null;
2933
}
3034
Object entity = null;
@@ -36,7 +40,7 @@ public <T> Example<T> getExample() {
3640
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
3741
for (PropertyDescriptor descriptor : descriptors) {
3842
String name = descriptor.getName();
39-
PageRequest.Filter value = request.getFilters().get(name);
43+
Filter value = requestFilter.getFilter(name);
4044
if (value != null) {
4145
try {
4246
descriptor.getWriteMethod().invoke(entity, value.getFilterValue(descriptor.getPropertyType()));
@@ -70,116 +74,120 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
7074
return orderList;
7175
}
7276

77+
78+
private <T> Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root<T> root, List<String> properties) {
79+
String key = filter.getKey();
80+
if (filter.isOr() || properties.contains(key)) {
81+
82+
if (filter.isEqual()) {
83+
return criteriaBuilder.equal(root.get(key), filter.getValue()[0]);
84+
}
85+
86+
if (filter.isLike()) {
87+
String matchValue = (String) filter.getValue()[0];
88+
return criteriaBuilder.like(root.get(key), "%" + matchValue + "%");
89+
}
90+
91+
if (filter.isBetween()) {
92+
Object value1 = filter.getValue()[0];
93+
Object value2 = filter.getValue()[2];
94+
if (value1 instanceof Integer && value2 instanceof Integer) {
95+
return criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2);
96+
}
97+
98+
if (value1 instanceof Long && value2 instanceof Long) {
99+
return criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2);
100+
}
101+
102+
if (value1 instanceof Date && value2 instanceof Date) {
103+
return criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2);
104+
}
105+
}
106+
107+
if (filter.isGreaterThan()) {
108+
Object value = filter.getValue()[0];
109+
if (value instanceof Integer) {
110+
return criteriaBuilder.greaterThan(root.get(key), (Integer) value);
111+
}
112+
if (value instanceof Long) {
113+
return criteriaBuilder.greaterThan(root.get(key), (Long) value);
114+
}
115+
if (value instanceof Date) {
116+
return criteriaBuilder.greaterThan(root.get(key), (Date) value);
117+
}
118+
}
119+
120+
if (filter.isGreaterThanEqual()) {
121+
Object value = filter.getValue()[0];
122+
if (value instanceof Integer) {
123+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value);
124+
}
125+
if (value instanceof Long) {
126+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value);
127+
}
128+
if (value instanceof Date) {
129+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value);
130+
}
131+
}
132+
133+
if (filter.isLessThan()) {
134+
Object value = filter.getValue()[0];
135+
if (value instanceof Integer) {
136+
return criteriaBuilder.lessThan(root.get(key), (Integer) value);
137+
}
138+
if (value instanceof Long) {
139+
return criteriaBuilder.lessThan(root.get(key), (Long) value);
140+
}
141+
if (value instanceof Date) {
142+
return criteriaBuilder.lessThan(root.get(key), (Date) value);
143+
}
144+
}
145+
146+
if (filter.isLessThanEqual()) {
147+
Object value = filter.getValue()[0];
148+
if (value instanceof Integer) {
149+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value);
150+
}
151+
if (value instanceof Long) {
152+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value);
153+
}
154+
if (value instanceof Date) {
155+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value);
156+
}
157+
}
158+
159+
if (filter.isIn()) {
160+
Object[] value = filter.getValue();
161+
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(key));
162+
for (Object item : value) {
163+
in.value(item);
164+
}
165+
return in;
166+
}
167+
168+
if (filter.isOr()) {
169+
Filter[] orFilters = (Filter[]) filter.getValue();
170+
List<Predicate> orPredicates = new ArrayList<>();
171+
for (Filter orFilter : orFilters) {
172+
orPredicates.add(toPredicate(orFilter, criteriaBuilder, root, properties));
173+
}
174+
return criteriaBuilder.or(orPredicates.toArray(new Predicate[0]));
175+
}
176+
}
177+
return null;
178+
}
179+
180+
73181
public <T> List<Predicate> getPredicate(Root<T> root, CriteriaBuilder criteriaBuilder) {
74182
List<Predicate> predicates = new ArrayList<>();
75183
List<String> properties = getClazzProperties();
76-
for (String key : request.getFilters().keySet()) {
77-
PageRequest.Filter filter = request.getFilters().get(key);
78-
if (filter.isOr() || properties.contains(key)) {
79-
if (filter.isEqual()) {
80-
predicates.add(criteriaBuilder.equal(root.get(key), filter.getValue()[0]));
81-
}
82-
83-
if (filter.isLike()) {
84-
String matchValue = (String) filter.getValue()[0];
85-
predicates.add(criteriaBuilder.like(root.get(key), "%" + matchValue + "%"));
86-
}
87-
88-
if (filter.isBetween()) {
89-
Object value1 = filter.getValue()[0];
90-
Object value2 = filter.getValue()[2];
91-
if (value1 instanceof Integer && value2 instanceof Integer) {
92-
predicates.add(criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2));
93-
}
94-
95-
if (value1 instanceof Long && value2 instanceof Long) {
96-
predicates.add(criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2));
97-
}
98-
99-
if (value1 instanceof Date && value2 instanceof Date) {
100-
predicates.add(criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2));
101-
}
102-
}
103-
104-
if (filter.isGreaterThan()) {
105-
Object value = filter.getValue()[0];
106-
if (value instanceof Integer) {
107-
predicates.add(criteriaBuilder.greaterThan(root.get(key), (Integer) value));
108-
}
109-
if (value instanceof Long) {
110-
predicates.add(criteriaBuilder.greaterThan(root.get(key), (Long) value));
111-
}
112-
if (value instanceof Date) {
113-
predicates.add(criteriaBuilder.greaterThan(root.get(key), (Date) value));
114-
}
115-
}
116-
117-
if (filter.isGreaterThanEqual()) {
118-
Object value = filter.getValue()[0];
119-
if (value instanceof Integer) {
120-
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value));
121-
}
122-
if (value instanceof Long) {
123-
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value));
124-
}
125-
if (value instanceof Date) {
126-
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value));
127-
}
128-
}
129-
130-
if (filter.isLessThan()) {
131-
Object value = filter.getValue()[0];
132-
if (value instanceof Integer) {
133-
predicates.add(criteriaBuilder.lessThan(root.get(key), (Integer) value));
134-
}
135-
if (value instanceof Long) {
136-
predicates.add(criteriaBuilder.lessThan(root.get(key), (Long) value));
137-
}
138-
if (value instanceof Date) {
139-
predicates.add(criteriaBuilder.lessThan(root.get(key), (Date) value));
140-
}
141-
}
142-
143-
if (filter.isLessThanEqual()) {
144-
Object value = filter.getValue()[0];
145-
if (value instanceof Integer) {
146-
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value));
147-
}
148-
if (value instanceof Long) {
149-
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value));
150-
}
151-
if (value instanceof Date) {
152-
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value));
153-
}
154-
}
155-
156-
if (filter.isIn()) {
157-
Object[] value = filter.getValue();
158-
predicates.add(criteriaBuilder.in(root.get(key)).value(value));
159-
}
160-
161-
if (filter.isOr()) {
162-
if(key.equals("OR")) {
163-
Object[] value = filter.getValue();
164-
165-
// 创建Predicate的列表,用于收集所有的OR条件
166-
List<Predicate> orPredicates = new ArrayList<>();
167-
168-
// 循环遍历value数组,每两个为一组
169-
for (int i = 0; i < value.length; i += 2) {
170-
orPredicates.add(criteriaBuilder.equal(root.get((String) value[i]), value[i + 1]));
171-
}
172-
173-
// 使用or方法连接所有的Predicate
174-
predicates.add(criteriaBuilder.or(orPredicates.toArray(new Predicate[0])));
175-
}else{
176-
Object[] value = filter.getValue();
177-
predicates.add(criteriaBuilder.equal(root.get(key), value[0]));
178-
}
179-
}
184+
RequestFilter requestFilter = request.getRequestFilter();
185+
for (Filter filter : requestFilter.getFilters()) {
186+
Predicate predicate = toPredicate(filter, criteriaBuilder, root, properties);
187+
if (predicate != null) {
188+
predicates.add(predicate);
180189
}
181190
}
182-
183191
return predicates;
184192
}
185193
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import com.codingapi.springboot.fast.entity.Demo;
44
import com.codingapi.springboot.fast.repository.DemoRepository;
5+
import com.codingapi.springboot.framework.dto.request.Filter;
56
import com.codingapi.springboot.framework.dto.request.PageRequest;
7+
import com.codingapi.springboot.framework.dto.request.Relation;
68
import org.junit.jupiter.api.Test;
79
import org.springframework.beans.factory.annotation.Autowired;
810
import org.springframework.boot.test.context.SpringBootTest;
@@ -68,14 +70,14 @@ void pageRequest() {
6870
PageRequest request = new PageRequest();
6971
request.setCurrent(1);
7072
request.setPageSize(10);
71-
request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%");
73+
request.addFilter("name", Relation.LIKE, "%2%");
7274

7375
Page<Demo> page = demoRepository.pageRequest(request);
7476
assertEquals(1, page.getTotalElements());
7577
}
7678

7779
@Test
78-
void pageRequestOr() {
80+
void customSearchOr() {
7981
demoRepository.deleteAll();
8082
Demo demo1 = new Demo();
8183
demo1.setName("123");
@@ -88,10 +90,11 @@ void pageRequestOr() {
8890
PageRequest request = new PageRequest();
8991
request.setCurrent(1);
9092
request.setPageSize(10);
91-
request.addOrFilters("name", "%2%","id","1");
93+
94+
request.orFilters(Filter.as("name", Relation.LIKE, "%2%"), Filter.as("id", Relation.IN, 1, 2, 3));
9295

9396
Page<Demo> page = demoRepository.pageRequest(request);
94-
assertEquals(1, page.getTotalElements());
97+
assertEquals(2, page.getTotalElements());
9598
}
9699

97100

0 commit comments

Comments
 (0)