Skip to content

Commit e44a9b1

Browse files
committed
fix FastRepository
1 parent 4e8c9d7 commit e44a9b1

File tree

9 files changed

+287
-284
lines changed

9 files changed

+287
-284
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package com.codingapi.springboot.fast.jpa.repository;
2+
3+
import com.codingapi.springboot.framework.dto.request.Filter;
4+
import com.codingapi.springboot.framework.dto.request.PageRequest;
5+
import com.codingapi.springboot.framework.dto.request.RequestFilter;
6+
import org.springframework.data.domain.Sort;
7+
8+
import java.util.ArrayList;
9+
import java.util.Arrays;
10+
import java.util.List;
11+
12+
public class DynamicRequest {
13+
14+
private final PageRequest request;
15+
private final Class<?> clazz;
16+
17+
private final List<Object> params = new ArrayList<>();
18+
private int paramIndex = 1;
19+
20+
public DynamicRequest(PageRequest request, Class<?> clazz) {
21+
this.request = request;
22+
this.clazz = clazz;
23+
}
24+
25+
26+
public String getHql() {
27+
StringBuilder hql = new StringBuilder("FROM " + clazz.getSimpleName() + " WHERE ");
28+
RequestFilter requestFilter = request.getRequestFilter();
29+
if (requestFilter.hasFilter()) {
30+
List<Filter> filters = requestFilter.getFilters();
31+
for (int i = 0; i < filters.size(); i++) {
32+
Filter filter = filters.get(i);
33+
this.buildSQL(filter, hql);
34+
if (i != filters.size() - 1) {
35+
hql.append(" AND ");
36+
}
37+
}
38+
}
39+
40+
Sort sort = request.getSort();
41+
if (sort.isSorted()) {
42+
hql.append(" ORDER BY ");
43+
List<Sort.Order> orders = sort.toList();
44+
for (int i = 0; i < orders.size(); i++) {
45+
Sort.Order order = orders.get(i);
46+
hql.append(order.getProperty()).append(" ").append(order.getDirection().name());
47+
if (i != orders.size() - 1) {
48+
hql.append(",");
49+
}
50+
}
51+
}
52+
53+
System.out.println(hql.toString());
54+
System.out.println(params);
55+
return hql.toString();
56+
}
57+
58+
59+
private void buildSQL(Filter filter, StringBuilder hql) {
60+
if (filter.isOrFilters()) {
61+
Filter[] orFilters = (Filter[]) filter.getValue();
62+
if (orFilters.length > 0) {
63+
hql.append(" ( ");
64+
for (int i = 0; i < orFilters.length; i++) {
65+
Filter orFilter = orFilters[i];
66+
this.buildSQL(orFilter, hql);
67+
if (i != orFilters.length - 1) {
68+
hql.append(" OR ");
69+
}
70+
71+
}
72+
hql.append(" )");
73+
}
74+
}
75+
76+
if (filter.isAndFilters()) {
77+
Filter[] andFilters = (Filter[]) filter.getValue();
78+
if (andFilters.length > 0) {
79+
hql.append(" ( ");
80+
for (int i = 0; i < andFilters.length; i++) {
81+
Filter andFilter = andFilters[i];
82+
this.buildSQL(andFilter, hql);
83+
if (i != andFilters.length - 1) {
84+
hql.append(" AND ");
85+
}
86+
}
87+
hql.append(" )");
88+
}
89+
}
90+
91+
if (filter.isEqual()) {
92+
hql.append(filter.getKey()).append(" = ?").append(paramIndex);
93+
params.add(filter.getValue()[0]);
94+
paramIndex++;
95+
}
96+
if (filter.isLike()) {
97+
hql.append(filter.getKey()).append(" LIKE ?").append(paramIndex);
98+
params.add("%" + filter.getValue()[0] + "%");
99+
paramIndex++;
100+
}
101+
if (filter.isIn()) {
102+
hql.append(filter.getKey()).append(" IN (").append("?").append(paramIndex).append(")");
103+
params.add(Arrays.asList(filter.getValue()));
104+
paramIndex++;
105+
}
106+
if (filter.isGreaterThan()) {
107+
hql.append(filter.getKey()).append(" > ?").append(paramIndex);
108+
params.add(filter.getValue()[0]);
109+
paramIndex++;
110+
}
111+
if (filter.isLessThan()) {
112+
hql.append(filter.getKey()).append(" < ?").append(paramIndex);
113+
params.add(filter.getValue()[0]);
114+
paramIndex++;
115+
}
116+
if (filter.isGreaterThanEqual()) {
117+
hql.append(filter.getKey()).append(" >= ?").append(paramIndex);
118+
params.add(filter.getValue()[0]);
119+
paramIndex++;
120+
}
121+
if (filter.isLessThanEqual()) {
122+
hql.append(filter.getKey()).append(" <= ?").append(paramIndex);
123+
params.add(filter.getValue()[0]);
124+
paramIndex++;
125+
}
126+
if (filter.isBetween()) {
127+
hql.append(filter.getKey()).append(" BETWEEN ?").append(paramIndex).append(" AND ?").append(paramIndex + 1);
128+
params.add(filter.getValue()[0]);
129+
params.add(filter.getValue()[1]);
130+
paramIndex += 2;
131+
}
132+
}
133+
134+
135+
public Object[] getParams() {
136+
return params.toArray();
137+
}
138+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.codingapi.springboot.fast.jpa.repository;
2+
3+
import com.codingapi.springboot.framework.dto.request.Filter;
4+
import com.codingapi.springboot.framework.dto.request.PageRequest;
5+
import com.codingapi.springboot.framework.dto.request.RequestFilter;
6+
import org.springframework.beans.BeanUtils;
7+
import org.springframework.data.domain.Example;
8+
9+
import java.beans.PropertyDescriptor;
10+
11+
public class ExampleRequest {
12+
13+
private final PageRequest request;
14+
private final Class<?> clazz;
15+
16+
public ExampleRequest(PageRequest request, Class<?> clazz) {
17+
this.request = request;
18+
this.clazz = clazz;
19+
}
20+
21+
public <T> Example<T> getExample() {
22+
RequestFilter requestFilter = request.getRequestFilter();
23+
if (!requestFilter.hasFilter()) {
24+
return null;
25+
}
26+
Object entity = null;
27+
try {
28+
entity = clazz.getDeclaredConstructor().newInstance();
29+
} catch (Exception e) {
30+
throw new RuntimeException(e);
31+
}
32+
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
33+
for (PropertyDescriptor descriptor : descriptors) {
34+
String name = descriptor.getName();
35+
Filter value = requestFilter.getFilter(name);
36+
if (value != null) {
37+
try {
38+
descriptor.getWriteMethod().invoke(entity, value.getFilterValue(descriptor.getPropertyType()));
39+
} catch (Exception e) {
40+
}
41+
}
42+
}
43+
return (Example<T>) Example.of(entity);
44+
}
45+
46+
}

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

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
11
package com.codingapi.springboot.fast.jpa.repository;
22

33
import com.codingapi.springboot.framework.dto.request.PageRequest;
4-
import javax.persistence.criteria.Order;
5-
import javax.persistence.criteria.Predicate;
64
import org.springframework.core.ResolvableType;
75
import org.springframework.data.domain.Page;
8-
import org.springframework.data.jpa.domain.Specification;
96
import org.springframework.data.jpa.repository.JpaRepository;
107
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
118
import org.springframework.data.repository.NoRepositoryBean;
129

13-
import java.util.List;
14-
1510
@NoRepositoryBean
1611
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T, ID> {
1712

1813
default Page<T> findAll(PageRequest request) {
1914
if (request.hasFilter()) {
2015
Class<T> clazz = getDomainClass();
21-
QueryRequest queryRequest = new QueryRequest(request, clazz);
22-
return findAll(queryRequest.getExample(), request);
16+
ExampleRequest exampleRequest = new ExampleRequest(request, clazz);
17+
return findAll(exampleRequest.getExample(), request);
2318
}
2419
return findAll((org.springframework.data.domain.PageRequest) request);
2520
}
@@ -35,14 +30,8 @@ default Class<T> getDomainClass() {
3530
default Page<T> pageRequest(PageRequest request) {
3631
if (request.hasFilter()) {
3732
Class<T> clazz = getDomainClass();
38-
Specification<T> specification = (root, query, criteriaBuilder) -> {
39-
QueryRequest queryRequest = new QueryRequest(request, clazz);
40-
List<Predicate> predicates = queryRequest.getPredicate(root, criteriaBuilder);
41-
List<Order> orderList = queryRequest.getOrder(root, criteriaBuilder);
42-
return query.where(predicates.toArray(new Predicate[0])).orderBy(orderList).getRestriction();
43-
};
44-
45-
return findAll(specification, request);
33+
DynamicRequest dynamicRequest = new DynamicRequest(request,clazz);
34+
return dynamicPageQuery(dynamicRequest.getHql(), request, dynamicRequest.getParams());
4635
}
4736
return findAll((org.springframework.data.domain.PageRequest) request);
4837
}

0 commit comments

Comments
 (0)