Skip to content

Commit c4bc780

Browse files
authored
Merge pull request #36 from codingapi/3.x
3.x
2 parents ddea139 + 4bf95ed commit c4bc780

File tree

21 files changed

+460
-231
lines changed

21 files changed

+460
-231
lines changed

pom.xml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<groupId>com.codingapi.springboot</groupId>
1414
<artifactId>springboot-parent</artifactId>
15-
<version>3.1.7</version>
15+
<version>3.1.8</version>
1616

1717
<url>https://github.com/codingapi/springboot-framewrok</url>
1818
<name>springboot-parent</name>
@@ -38,10 +38,11 @@
3838
<commons-text.version>1.11.0</commons-text.version>
3939
<org.reflections.version>0.10.2</org.reflections.version>
4040
<perf4j.version>0.9.16</perf4j.version>
41-
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
41+
<bcprov-jdk18on.version>1.77</bcprov-jdk18on.version>
4242
<commons-crypto.version>1.2.0</commons-crypto.version>
4343
<snakeyaml.version>2.2</snakeyaml.version>
4444
<apache-groovy.version>4.0.15</apache-groovy.version>
45+
<h2.version>2.2.224</h2.version>
4546
</properties>
4647

4748
<dependencies>
@@ -75,10 +76,17 @@
7576
<dependencyManagement>
7677
<dependencies>
7778

79+
<dependency>
80+
<groupId>com.h2database</groupId>
81+
<artifactId>h2</artifactId>
82+
<version>${h2.version}</version>
83+
</dependency>
84+
85+
7886
<dependency>
7987
<groupId>org.bouncycastle</groupId>
80-
<artifactId>bcprov-jdk15on</artifactId>
81-
<version>${bcprov-jdk15on.version}</version>
88+
<artifactId>bcprov-jdk18on</artifactId>
89+
<version>${bcprov-jdk18on.version}</version>
8290
</dependency>
8391

8492
<dependency>

springboot-starter-data-fast/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-parent</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>3.1.7</version>
8+
<version>3.1.8</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
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+
return hql.toString();
54+
}
55+
56+
57+
private void buildSQL(Filter filter, StringBuilder hql) {
58+
if (filter.isOrFilters()) {
59+
Filter[] orFilters = (Filter[]) filter.getValue();
60+
if (orFilters.length > 0) {
61+
hql.append(" ( ");
62+
for (int i = 0; i < orFilters.length; i++) {
63+
Filter orFilter = orFilters[i];
64+
this.buildSQL(orFilter, hql);
65+
if (i != orFilters.length - 1) {
66+
hql.append(" OR ");
67+
}
68+
69+
}
70+
hql.append(" )");
71+
}
72+
}
73+
74+
if (filter.isAndFilters()) {
75+
Filter[] andFilters = (Filter[]) filter.getValue();
76+
if (andFilters.length > 0) {
77+
hql.append(" ( ");
78+
for (int i = 0; i < andFilters.length; i++) {
79+
Filter andFilter = andFilters[i];
80+
this.buildSQL(andFilter, hql);
81+
if (i != andFilters.length - 1) {
82+
hql.append(" AND ");
83+
}
84+
}
85+
hql.append(" )");
86+
}
87+
}
88+
89+
if (filter.isEqual()) {
90+
hql.append(filter.getKey()).append(" = ?").append(paramIndex);
91+
params.add(filter.getValue()[0]);
92+
paramIndex++;
93+
}
94+
if (filter.isLike()) {
95+
hql.append(filter.getKey()).append(" LIKE ?").append(paramIndex);
96+
params.add("%" + filter.getValue()[0] + "%");
97+
paramIndex++;
98+
}
99+
if (filter.isIn()) {
100+
hql.append(filter.getKey()).append(" IN (").append("?").append(paramIndex).append(")");
101+
params.add(Arrays.asList(filter.getValue()));
102+
paramIndex++;
103+
}
104+
if (filter.isGreaterThan()) {
105+
hql.append(filter.getKey()).append(" > ?").append(paramIndex);
106+
params.add(filter.getValue()[0]);
107+
paramIndex++;
108+
}
109+
if (filter.isLessThan()) {
110+
hql.append(filter.getKey()).append(" < ?").append(paramIndex);
111+
params.add(filter.getValue()[0]);
112+
paramIndex++;
113+
}
114+
if (filter.isGreaterThanEqual()) {
115+
hql.append(filter.getKey()).append(" >= ?").append(paramIndex);
116+
params.add(filter.getValue()[0]);
117+
paramIndex++;
118+
}
119+
if (filter.isLessThanEqual()) {
120+
hql.append(filter.getKey()).append(" <= ?").append(paramIndex);
121+
params.add(filter.getValue()[0]);
122+
paramIndex++;
123+
}
124+
if (filter.isBetween()) {
125+
hql.append(filter.getKey()).append(" BETWEEN ?").append(paramIndex).append(" AND ?").append(paramIndex + 1);
126+
params.add(filter.getValue()[0]);
127+
params.add(filter.getValue()[1]);
128+
paramIndex += 2;
129+
}
130+
}
131+
132+
133+
public Object[] getParams() {
134+
return params.toArray();
135+
}
136+
}
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 jakarta.persistence.criteria.Order;
5-
import jakarta.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)