Skip to content

Commit fba1866

Browse files
committed
add or search
1 parent 83a4153 commit fba1866

File tree

2 files changed

+127
-75
lines changed
  • springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request
  • springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query

2 files changed

+127
-75
lines changed

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

Lines changed: 113 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -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,86 +72,114 @@ 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
}
144182

145183
return predicates;
146184
}
147-
}
185+
}

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)