Skip to content

Commit 8302e64

Browse files
committed
add or search
1 parent 5eabfda commit 8302e64

File tree

3 files changed

+149
-77
lines changed

3 files changed

+149
-77
lines changed

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

Lines changed: 115 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.codingapi.springboot.fast.query;
22

33
import com.codingapi.springboot.framework.dto.request.PageRequest;
4+
import org.springframework.beans.BeanUtils;
5+
import org.springframework.data.domain.Example;
6+
47
import javax.persistence.criteria.CriteriaBuilder;
58
import javax.persistence.criteria.Order;
69
import javax.persistence.criteria.Predicate;
710
import javax.persistence.criteria.Root;
8-
import org.springframework.beans.BeanUtils;
9-
import org.springframework.data.domain.Example;
10-
1111
import java.beans.PropertyDescriptor;
1212
import java.util.ArrayList;
1313
import java.util.Date;
@@ -48,6 +48,16 @@ public <T> Example<T> getExample() {
4848
}
4949

5050

51+
private List<String> getClazzProperties() {
52+
List<String> properties = new ArrayList<>();
53+
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
54+
for (PropertyDescriptor descriptor : descriptors) {
55+
properties.add(descriptor.getName());
56+
}
57+
return properties;
58+
}
59+
60+
5161
public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
5262
List<Order> orderList = new ArrayList<>();
5363
request.getSort().forEach(sort -> {
@@ -62,82 +72,110 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
6272

6373
public <T> List<Predicate> getPredicate(Root<T> root, CriteriaBuilder criteriaBuilder) {
6474
List<Predicate> predicates = new ArrayList<>();
75+
List<String> properties = getClazzProperties();
6576
for (String key : request.getFilters().keySet()) {
6677
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));
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+
}
141179
}
142180
}
143181
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,26 @@ void pageRequest() {
7474
assertEquals(1, page.getTotalElements());
7575
}
7676

77+
@Test
78+
void pageRequestOr() {
79+
demoRepository.deleteAll();
80+
Demo demo1 = new Demo();
81+
demo1.setName("123");
82+
demoRepository.save(demo1);
83+
84+
Demo demo2 = new Demo();
85+
demo2.setName("456");
86+
demoRepository.save(demo2);
87+
88+
PageRequest request = new PageRequest();
89+
request.setCurrent(1);
90+
request.setPageSize(10);
91+
request.addOrFilters("name", "%2%","id","1");
92+
93+
Page<Demo> page = demoRepository.pageRequest(request);
94+
assertEquals(1, page.getTotalElements());
95+
}
96+
7797

7898
@Test
7999
void dynamicListQuery() {

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,15 @@ public PageRequest addFilter(String key, Object... value) {
205205
return this.addFilter(key, FilterRelation.EUQAL, value);
206206
}
207207

208+
public PageRequest addOrFilters(Object... value) {
209+
// 检查value数组是否为偶数长度,因为我们需要成对处理它
210+
if (value.length % 2 != 0) {
211+
throw new IllegalArgumentException("Invalid number of elements in value array.");
212+
}
213+
214+
return this.addFilter("OR", FilterRelation.OR, value);
215+
}
216+
208217
public boolean hasFilter() {
209218
return !this.filters.isEmpty();
210219
}
@@ -233,6 +242,10 @@ public boolean isIn() {
233242
return relation == FilterRelation.IN;
234243
}
235244

245+
public boolean isOr() {
246+
return relation == FilterRelation.OR;
247+
}
248+
236249
public boolean isGreaterThan() {
237250
return relation == FilterRelation.GREATER_THAN;
238251
}
@@ -287,6 +300,7 @@ public enum FilterRelation {
287300
LESS_THAN,
288301
GREATER_THAN_EQUAL,
289302
LESS_THAN_EQUAL,
303+
OR,
290304
}
291305

292306

0 commit comments

Comments
 (0)