Skip to content

Commit d229ce2

Browse files
committed
fix Filter
1 parent bf55485 commit d229ce2

File tree

8 files changed

+384
-254
lines changed

8 files changed

+384
-254
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T,ID> {
1818

1919
default Page<T> findAll(PageRequest request) {
20-
if (request.hasFilter()) {
20+
if (request.getRequestFilter().hasFilter()) {
2121
Class<T> clazz = getDomainClass();
2222
QueryRequest queryRequest = new QueryRequest(request, clazz);
2323
return findAll(queryRequest.getExample(), request);
@@ -34,7 +34,7 @@ default Class<T> getDomainClass() {
3434

3535

3636
default Page<T> pageRequest(PageRequest request) {
37-
if (request.hasFilter()) {
37+
if (request.getRequestFilter().hasFilter()) {
3838
Class<T> clazz = getDomainClass();
3939
Specification<T> specification = (root, query, criteriaBuilder) -> {
4040
QueryRequest queryRequest = new QueryRequest(request, clazz);
Lines changed: 114 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.codingapi.springboot.fast.query;
22

3+
import com.codingapi.springboot.framework.dto.request.Filter;
34
import com.codingapi.springboot.framework.dto.request.PageRequest;
5+
import com.codingapi.springboot.framework.dto.request.RequestFilter;
46
import jakarta.persistence.criteria.CriteriaBuilder;
57
import jakarta.persistence.criteria.Order;
68
import jakarta.persistence.criteria.Predicate;
@@ -24,7 +26,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
2426
}
2527

2628
public <T> Example<T> getExample() {
27-
if (!request.hasFilter()) {
29+
RequestFilter requestFilter = request.getRequestFilter();
30+
if (!requestFilter.hasFilter()) {
2831
return null;
2932
}
3033
Object entity = null;
@@ -36,7 +39,7 @@ public <T> Example<T> getExample() {
3639
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
3740
for (PropertyDescriptor descriptor : descriptors) {
3841
String name = descriptor.getName();
39-
PageRequest.Filter value = request.getFilters().get(name);
42+
Filter value = requestFilter.getFilter(name);
4043
if (value != null) {
4144
try {
4245
descriptor.getWriteMethod().invoke(entity, value.getFilterValue(descriptor.getPropertyType()));
@@ -70,116 +73,120 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
7073
return orderList;
7174
}
7275

76+
77+
private <T> Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root<T> root, List<String> properties) {
78+
String key = filter.getKey();
79+
if (filter.isOr() || properties.contains(key)) {
80+
81+
if (filter.isEqual()) {
82+
return criteriaBuilder.equal(root.get(key), filter.getValue()[0]);
83+
}
84+
85+
if (filter.isLike()) {
86+
String matchValue = (String) filter.getValue()[0];
87+
return criteriaBuilder.like(root.get(key), "%" + matchValue + "%");
88+
}
89+
90+
if (filter.isBetween()) {
91+
Object value1 = filter.getValue()[0];
92+
Object value2 = filter.getValue()[2];
93+
if (value1 instanceof Integer && value2 instanceof Integer) {
94+
return criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2);
95+
}
96+
97+
if (value1 instanceof Long && value2 instanceof Long) {
98+
return criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2);
99+
}
100+
101+
if (value1 instanceof Date && value2 instanceof Date) {
102+
return criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2);
103+
}
104+
}
105+
106+
if (filter.isGreaterThan()) {
107+
Object value = filter.getValue()[0];
108+
if (value instanceof Integer) {
109+
return criteriaBuilder.greaterThan(root.get(key), (Integer) value);
110+
}
111+
if (value instanceof Long) {
112+
return criteriaBuilder.greaterThan(root.get(key), (Long) value);
113+
}
114+
if (value instanceof Date) {
115+
return criteriaBuilder.greaterThan(root.get(key), (Date) value);
116+
}
117+
}
118+
119+
if (filter.isGreaterThanEqual()) {
120+
Object value = filter.getValue()[0];
121+
if (value instanceof Integer) {
122+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value);
123+
}
124+
if (value instanceof Long) {
125+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value);
126+
}
127+
if (value instanceof Date) {
128+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value);
129+
}
130+
}
131+
132+
if (filter.isLessThan()) {
133+
Object value = filter.getValue()[0];
134+
if (value instanceof Integer) {
135+
return criteriaBuilder.lessThan(root.get(key), (Integer) value);
136+
}
137+
if (value instanceof Long) {
138+
return criteriaBuilder.lessThan(root.get(key), (Long) value);
139+
}
140+
if (value instanceof Date) {
141+
return criteriaBuilder.lessThan(root.get(key), (Date) value);
142+
}
143+
}
144+
145+
if (filter.isLessThanEqual()) {
146+
Object value = filter.getValue()[0];
147+
if (value instanceof Integer) {
148+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value);
149+
}
150+
if (value instanceof Long) {
151+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value);
152+
}
153+
if (value instanceof Date) {
154+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value);
155+
}
156+
}
157+
158+
if (filter.isIn()) {
159+
Object[] value = filter.getValue();
160+
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(key));
161+
for (Object item : value) {
162+
in.value(item);
163+
}
164+
return in;
165+
}
166+
167+
if (filter.isOr()) {
168+
Filter[] orFilters = (Filter[]) filter.getValue();
169+
List<Predicate> orPredicates = new ArrayList<>();
170+
for (Filter orFilter : orFilters) {
171+
orPredicates.add(toPredicate(orFilter, criteriaBuilder, root, properties));
172+
}
173+
return criteriaBuilder.or(orPredicates.toArray(new Predicate[0]));
174+
}
175+
}
176+
return null;
177+
}
178+
179+
73180
public <T> List<Predicate> getPredicate(Root<T> root, CriteriaBuilder criteriaBuilder) {
74181
List<Predicate> predicates = new ArrayList<>();
75182
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-
}
183+
RequestFilter requestFilter = request.getRequestFilter();
184+
for (Filter filter : requestFilter.getFilters()) {
185+
Predicate predicate = toPredicate(filter, criteriaBuilder, root, properties);
186+
if (predicate != null) {
187+
predicates.add(predicate);
180188
}
181189
}
182-
183190
return predicates;
184191
}
185192
}

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

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
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;
8+
import lombok.extern.slf4j.Slf4j;
69
import org.junit.jupiter.api.Test;
710
import org.springframework.beans.factory.annotation.Autowired;
811
import org.springframework.boot.test.context.SpringBootTest;
@@ -16,6 +19,7 @@
1619
import static org.junit.jupiter.api.Assertions.assertEquals;
1720
import static org.junit.jupiter.api.Assertions.assertTrue;
1821

22+
@Slf4j
1923
@SpringBootTest
2024
public class DemoRepositoryTest {
2125

@@ -68,13 +72,59 @@ void pageRequest() {
6872
PageRequest request = new PageRequest();
6973
request.setCurrent(1);
7074
request.setPageSize(10);
71-
request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%");
75+
request.addFilter("name", Relation.LIKE, "%2%");
7276

7377
Page<Demo> page = demoRepository.pageRequest(request);
7478
assertEquals(1, page.getTotalElements());
7579
}
7680

7781

82+
@Test
83+
void customInSearch() {
84+
demoRepository.deleteAll();
85+
Demo demo1 = new Demo();
86+
demo1.setName("123");
87+
demoRepository.save(demo1);
88+
89+
Demo demo2 = new Demo();
90+
demo2.setName("456");
91+
demoRepository.save(demo2);
92+
93+
PageRequest request = new PageRequest();
94+
request.setCurrent(1);
95+
request.setPageSize(10);
96+
97+
request.addFilter("id", Relation.IN, 1, 2, 3);
98+
99+
Page<Demo> page = demoRepository.pageRequest(request);
100+
log.info("demo:{}", page.getContent());
101+
assertEquals(2, page.getTotalElements());
102+
}
103+
104+
105+
@Test
106+
void customOrSearch() {
107+
demoRepository.deleteAll();
108+
Demo demo1 = new Demo();
109+
demo1.setName("123");
110+
demoRepository.save(demo1);
111+
112+
Demo demo2 = new Demo();
113+
demo2.setName("456");
114+
demoRepository.save(demo2);
115+
116+
PageRequest request = new PageRequest();
117+
request.setCurrent(1);
118+
request.setPageSize(10);
119+
120+
121+
request.orFilters(Filter.as("id", Relation.IN, 1, 2, 3), Filter.as("name", "123"));
122+
123+
Page<Demo> page = demoRepository.pageRequest(request);
124+
log.info("demo:{}", page.getContent());
125+
assertEquals(2, page.getTotalElements());
126+
}
127+
78128
@Test
79129
void dynamicListQuery() {
80130
demoRepository.deleteAll();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import lombok.Setter;
66

77
import jakarta.persistence.*;
8+
import lombok.ToString;
89

910
@Setter
1011
@Getter
1112
@Entity
1213
@Table(name = "t_demo")
14+
@ToString
1315
public class Demo implements ISort {
1416
@Id
1517
@GeneratedValue(strategy = GenerationType.IDENTITY)

0 commit comments

Comments
 (0)