Skip to content

Commit 5bf6143

Browse files
committed
add SearchRequest
1 parent 10eecc5 commit 5bf6143

File tree

14 files changed

+210
-84
lines changed

14 files changed

+210
-84
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
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>2.7.8</version>
15+
<version>2.7.9.dev</version>
1616

1717
<url>https://github.com/codingapi/springboot-framewrok</url>
1818
<name>springboot-parent</name>

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>2.7.8</version>
8+
<version>2.7.9.dev</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,32 @@
33
import com.codingapi.springboot.framework.dto.request.Filter;
44
import com.codingapi.springboot.framework.dto.request.PageRequest;
55
import com.codingapi.springboot.framework.dto.request.RequestFilter;
6+
import lombok.extern.slf4j.Slf4j;
67
import org.springframework.data.domain.Sort;
78

89
import java.util.ArrayList;
910
import java.util.Arrays;
1011
import java.util.List;
1112

12-
public class DynamicRequest {
13+
/**
14+
* 动态条件查询组装
15+
*/
16+
@Slf4j
17+
class DynamicSQLBuilder {
1318

1419
private final PageRequest request;
1520
private final Class<?> clazz;
1621

1722
private final List<Object> params = new ArrayList<>();
1823
private int paramIndex = 1;
1924

20-
public DynamicRequest(PageRequest request, Class<?> clazz) {
25+
public DynamicSQLBuilder(PageRequest request, Class<?> clazz) {
2126
this.request = request;
2227
this.clazz = clazz;
2328
}
2429

2530

26-
public String getHql() {
31+
public String getHQL() {
2732
StringBuilder hql = new StringBuilder("FROM " + clazz.getSimpleName() + " WHERE ");
2833
RequestFilter requestFilter = request.getRequestFilter();
2934
if (requestFilter.hasFilter()) {
@@ -50,6 +55,8 @@ public String getHql() {
5055
}
5156
}
5257

58+
log.debug("hql:{}", hql);
59+
log.debug("params:{}", params);
5360
return hql.toString();
5461
}
5562

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88

99
import java.beans.PropertyDescriptor;
1010

11-
public class ExampleRequest {
11+
/**
12+
* Example组装
13+
*/
14+
class ExampleBuilder {
1215

1316
private final PageRequest request;
1417
private final Class<?> clazz;
1518

16-
public ExampleRequest(PageRequest request, Class<?> clazz) {
19+
public ExampleBuilder(PageRequest request, Class<?> clazz) {
1720
this.request = request;
1821
this.clazz = clazz;
1922
}

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@
77
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
88
import org.springframework.data.repository.NoRepositoryBean;
99

10+
/**
11+
* 更强大的Repository对象
12+
* @param <T>
13+
* @param <ID>
14+
*/
1015
@NoRepositoryBean
1116
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T, ID> {
1217

1318
default Page<T> findAll(PageRequest request) {
1419
if (request.hasFilter()) {
1520
Class<T> clazz = getDomainClass();
16-
ExampleRequest exampleRequest = new ExampleRequest(request, clazz);
17-
return findAll(exampleRequest.getExample(), request);
21+
ExampleBuilder exampleBuilder = new ExampleBuilder(request, clazz);
22+
return findAll(exampleBuilder.getExample(), request);
1823
}
1924
return findAll((org.springframework.data.domain.PageRequest) request);
2025
}
@@ -30,10 +35,16 @@ default Class<T> getDomainClass() {
3035
default Page<T> pageRequest(PageRequest request) {
3136
if (request.hasFilter()) {
3237
Class<T> clazz = getDomainClass();
33-
DynamicRequest dynamicRequest = new DynamicRequest(request,clazz);
34-
return dynamicPageQuery(dynamicRequest.getHql(), request, dynamicRequest.getParams());
38+
DynamicSQLBuilder dynamicSQLBuilder = new DynamicSQLBuilder(request, clazz);
39+
return dynamicPageQuery(dynamicSQLBuilder.getHQL(), request, dynamicSQLBuilder.getParams());
3540
}
3641
return findAll((org.springframework.data.domain.PageRequest) request);
3742
}
3843

44+
45+
default Page<T> searchRequest(SearchRequest request) {
46+
Class<T> clazz = getDomainClass();
47+
return pageRequest(request.toPageRequest(clazz));
48+
}
49+
3950
}
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package com.codingapi.springboot.fast.jpa.repository;
2+
3+
import com.alibaba.fastjson.JSON;
4+
import com.alibaba.fastjson.JSONArray;
5+
import com.alibaba.fastjson.JSONObject;
6+
import com.codingapi.springboot.framework.dto.request.PageRequest;
7+
import com.codingapi.springboot.framework.dto.request.Relation;
8+
import javax.servlet.http.HttpServletRequest;
9+
import org.springframework.data.domain.Sort;
10+
import org.springframework.util.StringUtils;
11+
import org.springframework.web.context.request.RequestContextHolder;
12+
import org.springframework.web.context.request.ServletRequestAttributes;
13+
14+
import java.lang.reflect.Field;
15+
import java.util.ArrayList;
16+
import java.util.Base64;
17+
import java.util.Enumeration;
18+
import java.util.List;
19+
import java.util.stream.Collectors;
20+
21+
/**
22+
* HttpServletRequest 请求参数解析成 PageRequest对象
23+
*/
24+
public class SearchRequest {
25+
26+
private int current;
27+
private int pageSize;
28+
29+
private final HttpServletRequest request;
30+
31+
private final List<String> removeKeys = new ArrayList<>();
32+
33+
private final PageRequest pageRequest;
34+
35+
public SearchRequest() {
36+
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
37+
this.request = attributes.getRequest();
38+
this.pageRequest = new PageRequest();
39+
}
40+
41+
public void setCurrent(int current) {
42+
this.current = current - 1;
43+
this.removeKeys.add("current");
44+
}
45+
46+
public void setPageSize(int pageSize) {
47+
this.pageSize = pageSize;
48+
this.removeKeys.add("pageSize");
49+
}
50+
51+
private String decode(String value) {
52+
return new String(Base64.getDecoder().decode(value));
53+
}
54+
55+
56+
static class ClassContent {
57+
58+
private final Class<?> clazz;
59+
private final PageRequest pageRequest;
60+
61+
public ClassContent(Class<?> clazz, PageRequest pageRequest) {
62+
this.clazz = clazz;
63+
this.pageRequest = pageRequest;
64+
}
65+
66+
public void addFilter(String key, String value) {
67+
Class<?> keyClass = getKeyType(key);
68+
Object v = JSON.parseObject(value, keyClass);
69+
pageRequest.addFilter(key, Relation.EQUAL, v);
70+
}
71+
72+
public void addFilter(String key, List<String> value) {
73+
Class<?> keyClass = getKeyType(key);
74+
pageRequest.addFilter(key, Relation.IN, value.stream()
75+
.map(v -> JSON.parseObject(v, keyClass))
76+
.toArray()
77+
);
78+
}
79+
80+
81+
private Class<?> getKeyType(String key) {
82+
String[] keys = key.split("\\.");
83+
Class<?> keyClass = clazz;
84+
for (String k : keys) {
85+
Field[] fields = keyClass.getDeclaredFields();
86+
for (Field field : fields) {
87+
if (field.getName().equals(k)) {
88+
keyClass = field.getType();
89+
break;
90+
}
91+
}
92+
}
93+
return keyClass;
94+
}
95+
96+
}
97+
98+
PageRequest toPageRequest(Class<?> clazz) {
99+
pageRequest.setCurrent(current);
100+
pageRequest.setPageSize(pageSize);
101+
102+
ClassContent content = new ClassContent(clazz, pageRequest);
103+
104+
String sort = request.getParameter("sort");
105+
if (StringUtils.hasLength(sort)) {
106+
sort = decode(sort);
107+
if (JSON.isValid(sort)) {
108+
removeKeys.add("sort");
109+
JSONObject jsonObject = JSON.parseObject(sort);
110+
for (String key : jsonObject.keySet()) {
111+
String value = jsonObject.getString(key);
112+
if ("ascend".equals(value)) {
113+
pageRequest.addSort(Sort.by(key).ascending());
114+
} else {
115+
pageRequest.addSort(Sort.by(key).descending());
116+
}
117+
}
118+
}
119+
}
120+
121+
122+
String filter = request.getParameter("filter");
123+
if (StringUtils.hasLength(filter)) {
124+
filter = decode(filter);
125+
if (JSON.isValid(filter)) {
126+
removeKeys.add("filter");
127+
JSONObject jsonObject = JSON.parseObject(filter);
128+
for (String key : jsonObject.keySet()) {
129+
JSONArray value = jsonObject.getJSONArray(key);
130+
if (value != null && !value.isEmpty()) {
131+
List<String> values = value.stream().map(Object::toString).collect(Collectors.toList());
132+
content.addFilter(key, values);
133+
}
134+
}
135+
}
136+
}
137+
138+
Enumeration<String> enumeration = request.getParameterNames();
139+
while (enumeration.hasMoreElements()){
140+
String key = enumeration.nextElement();
141+
if (!removeKeys.contains(key)) {
142+
String value = request.getParameter(key);
143+
if (StringUtils.hasLength(value)) {
144+
content.addFilter(key, value);
145+
}
146+
}
147+
}
148+
149+
150+
return pageRequest;
151+
}
152+
153+
154+
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ void findAll() {
4747
demoRepository.save(demo2);
4848

4949
PageRequest request = new PageRequest();
50-
request.setCurrent(1);
50+
request.setCurrent(0);
5151
request.setPageSize(10);
5252
request.addFilter("name", "123");
5353

@@ -68,9 +68,9 @@ void pageRequest() {
6868
demoRepository.save(demo2);
6969

7070
PageRequest request = new PageRequest();
71-
request.setCurrent(1);
71+
request.setCurrent(0);
7272
request.setPageSize(10);
73-
request.andFilter("name", Relation.LIKE, "%2%");
73+
request.addFilter("name", Relation.LIKE, "%2%");
7474

7575
Page<Demo> page = demoRepository.pageRequest(request);
7676
assertEquals(1, page.getTotalElements());
@@ -89,10 +89,10 @@ void customInSearch() {
8989
demoRepository.save(demo2);
9090

9191
PageRequest request = new PageRequest();
92-
request.setCurrent(1);
92+
request.setCurrent(0);
9393
request.setPageSize(10);
9494

95-
request.andFilter("id", Relation.IN, 1, 2, 3);
95+
request.addFilter("id", Relation.IN, 1, 2, 3);
9696

9797
Page<Demo> page = demoRepository.pageRequest(request);
9898
log.info("demo:{}", page.getContent());
@@ -112,7 +112,7 @@ void customOrSearch() {
112112
demoRepository.save(demo2);
113113

114114
PageRequest request = new PageRequest();
115-
request.setCurrent(1);
115+
request.setCurrent(0);
116116
request.setPageSize(10);
117117

118118

@@ -167,7 +167,7 @@ void sortQuery() {
167167
demoRepository.save(demo2);
168168

169169
PageRequest request = new PageRequest();
170-
request.setCurrent(1);
170+
request.setCurrent(0);
171171
request.setPageSize(10);
172172

173173
request.addSort(Sort.by("id").descending());

springboot-starter-security-jwt/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.7.8</version>
9+
<version>2.7.9.dev</version>
1010
</parent>
1111

1212
<artifactId>springboot-starter-security-jwt</artifactId>

springboot-starter/pom.xml

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

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.codingapi.springboot.framework.dto.request;
22

3-
43
import lombok.Getter;
54
import lombok.Setter;
65

@@ -26,7 +25,7 @@ public Filter(String key, Object... value) {
2625
}
2726

2827
public Filter(String key, Filter... value) {
29-
this(key, null, value);
28+
this(key, null, value);
3029
}
3130

3231
public static Filter as(String key, Relation relation, Object... value) {

0 commit comments

Comments
 (0)