From 00aa586ca09e81a227ba8337e197e22a98489023 Mon Sep 17 00:00:00 2001
From: lorne <1991wangliang@gmail.com>
Date: Sat, 6 Jan 2024 00:16:07 +0800
Subject: [PATCH 01/10] add SearchRequest
---
pom.xml | 2 +-
springboot-starter-data-fast/pom.xml | 2 +-
.../fast/jpa/repository/DynamicRequest.java | 2 +
.../fast/jpa/repository/FastRepository.java | 8 +-
.../fast/jpa/repository/SearchRequest.java | 148 ++++++++++++++++++
.../springboot/fast/DemoRepositoryTest.java | 8 +-
springboot-starter-security-jwt/pom.xml | 2 +-
springboot-starter/pom.xml | 2 +-
.../framework/dto/request/Filter.java | 2 +-
.../framework/dto/request/PageRequest.java | 55 +------
.../dto/request/PageRequestTest.java | 2 +-
.../query/test/DemoRepositoryTest.java | 4 +-
12 files changed, 177 insertions(+), 60 deletions(-)
create mode 100644 springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/SearchRequest.java
diff --git a/pom.xml b/pom.xml
index 6da224a2..5e89b3e9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,7 @@
com.codingapi.springboot
springboot-parent
- 3.1.8
+ 3.1.9.dev
https://github.com/codingapi/springboot-framewrok
springboot-parent
diff --git a/springboot-starter-data-fast/pom.xml b/springboot-starter-data-fast/pom.xml
index 47e1f703..93d8c382 100644
--- a/springboot-starter-data-fast/pom.xml
+++ b/springboot-starter-data-fast/pom.xml
@@ -5,7 +5,7 @@
springboot-parent
com.codingapi.springboot
- 3.1.8
+ 3.1.9.dev
4.0.0
diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRequest.java
index ef91f3c6..f6be561c 100644
--- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRequest.java
+++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRequest.java
@@ -50,6 +50,8 @@ public String getHql() {
}
}
+ System.out.println(hql);
+ System.out.println(params);
return hql.toString();
}
diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/FastRepository.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/FastRepository.java
index 4b55b787..8b00d051 100644
--- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/FastRepository.java
+++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/FastRepository.java
@@ -30,10 +30,16 @@ default Class getDomainClass() {
default Page pageRequest(PageRequest request) {
if (request.hasFilter()) {
Class clazz = getDomainClass();
- DynamicRequest dynamicRequest = new DynamicRequest(request,clazz);
+ DynamicRequest dynamicRequest = new DynamicRequest(request, clazz);
return dynamicPageQuery(dynamicRequest.getHql(), request, dynamicRequest.getParams());
}
return findAll((org.springframework.data.domain.PageRequest) request);
}
+
+ default Page searchRequest(SearchRequest request) {
+ Class clazz = getDomainClass();
+ return pageRequest(request.toPageRequest(clazz));
+ }
+
}
diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/SearchRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/SearchRequest.java
new file mode 100644
index 00000000..401f90e3
--- /dev/null
+++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/SearchRequest.java
@@ -0,0 +1,148 @@
+package com.codingapi.springboot.fast.jpa.repository;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.codingapi.springboot.framework.dto.request.PageRequest;
+import com.codingapi.springboot.framework.dto.request.Relation;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.List;
+
+
+public class SearchRequest {
+
+ private int current;
+ private int pageSize;
+
+ private final HttpServletRequest request;
+
+ private final List removeKeys = new ArrayList<>();
+
+ private final PageRequest pageRequest;
+
+ public SearchRequest() {
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
+ this.request = attributes.getRequest();
+ this.pageRequest = new PageRequest();
+ }
+
+ public void setCurrent(int current) {
+ this.current = current - 1;
+ this.removeKeys.add("current");
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ this.removeKeys.add("pageSize");
+ }
+
+ private String decode(String value) {
+ return new String(Base64.getDecoder().decode(value));
+ }
+
+
+ static class ClassContent {
+
+ private final Class> clazz;
+ private final PageRequest pageRequest;
+
+ public ClassContent(Class> clazz, PageRequest pageRequest) {
+ this.clazz = clazz;
+ this.pageRequest = pageRequest;
+ }
+
+ public void addFilter(String key, String value) {
+ Class> keyClass = getKeyClass(key);
+ Object v = JSON.parseObject(value, keyClass);
+ pageRequest.addFilter(key, Relation.EQUAL, v);
+ }
+
+ public void addFilter(String key, List value) {
+ Class> keyClass = getKeyClass(key);
+ pageRequest.addFilter(key, Relation.IN, value.stream()
+ .map(v -> JSON.parseObject(v, keyClass))
+ .toArray()
+ );
+ }
+
+
+ private Class> getKeyClass(String key) {
+ String[] keys = key.split("\\.");
+ Class> keyClass = clazz;
+ for (String k : keys) {
+ Field[] fields = keyClass.getDeclaredFields();
+ for (Field field : fields) {
+ if (field.getName().equals(k)) {
+ keyClass = field.getType();
+ break;
+ }
+ }
+ }
+ return keyClass;
+ }
+
+ }
+
+ PageRequest toPageRequest(Class> clazz) {
+ pageRequest.setCurrent(current);
+ pageRequest.setPageSize(pageSize);
+
+ ClassContent content = new ClassContent(clazz, pageRequest);
+
+ String sort = request.getParameter("sort");
+ if (StringUtils.hasLength(sort)) {
+ sort = decode(sort);
+ if (JSON.isValid(sort)) {
+ removeKeys.add("sort");
+ JSONObject jsonObject = JSON.parseObject(sort);
+ for (String key : jsonObject.keySet()) {
+ String value = jsonObject.getString(key);
+ if ("ascend".equals(value)) {
+ pageRequest.addSort(Sort.by(key).ascending());
+ } else {
+ pageRequest.addSort(Sort.by(key).descending());
+ }
+ }
+ }
+ }
+
+
+ String filter = request.getParameter("filter");
+ if (StringUtils.hasLength(filter)) {
+ filter = decode(filter);
+ if (JSON.isValid(filter)) {
+ removeKeys.add("filter");
+ JSONObject jsonObject = JSON.parseObject(filter);
+ for (String key : jsonObject.keySet()) {
+ JSONArray value = jsonObject.getJSONArray(key);
+ if (value != null && !value.isEmpty()) {
+ List values = value.stream().map(Object::toString).toList();
+ content.addFilter(key, values);
+ }
+ }
+ }
+ }
+
+
+ request.getParameterNames().asIterator().forEachRemaining(key -> {
+ if (!removeKeys.contains(key)) {
+ String value = request.getParameter(key);
+ if (StringUtils.hasLength(value)) {
+ content.addFilter(key, value);
+ }
+ }
+ });
+
+ return pageRequest;
+ }
+
+
+}
diff --git a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java
index 6f973873..64e20989 100644
--- a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java
+++ b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java
@@ -70,7 +70,7 @@ void pageRequest() {
PageRequest request = new PageRequest();
request.setCurrent(1);
request.setPageSize(10);
- request.andFilter("name", Relation.LIKE, "%2%");
+ request.addFilter("name", Relation.LIKE, "%2%");
Page page = demoRepository.pageRequest(request);
assertEquals(1, page.getTotalElements());
@@ -92,7 +92,7 @@ void customInSearch() {
request.setCurrent(1);
request.setPageSize(10);
- request.andFilter("id", Relation.IN, 1, 2, 3);
+ request.addFilter("id", Relation.IN, 1, 2, 3);
Page page = demoRepository.pageRequest(request);
log.info("demo:{}", page.getContent());
@@ -112,7 +112,7 @@ void customOrSearch() {
demoRepository.save(demo2);
PageRequest request = new PageRequest();
- request.setCurrent(1);
+ request.setCurrent(0);
request.setPageSize(10);
@@ -172,7 +172,7 @@ void sortQuery() {
demoRepository.save(demo2);
PageRequest request = new PageRequest();
- request.setCurrent(1);
+ request.setCurrent(0);
request.setPageSize(10);
request.addSort(Sort.by("id").descending());
diff --git a/springboot-starter-security-jwt/pom.xml b/springboot-starter-security-jwt/pom.xml
index 54bcf40a..4728dcba 100644
--- a/springboot-starter-security-jwt/pom.xml
+++ b/springboot-starter-security-jwt/pom.xml
@@ -6,7 +6,7 @@
springboot-parent
com.codingapi.springboot
- 3.1.8
+ 3.1.9.dev
springboot-starter-security-jwt
diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml
index 2af62d1f..d7cdc733 100644
--- a/springboot-starter/pom.xml
+++ b/springboot-starter/pom.xml
@@ -5,7 +5,7 @@
com.codingapi.springboot
springboot-parent
- 3.1.8
+ 3.1.9.dev
springboot-starter
diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java
index db6c5477..55c901b8 100644
--- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java
+++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java
@@ -25,7 +25,7 @@ public Filter(String key, Object... value) {
}
public Filter(String key, Filter... value) {
- this(key, null, value);
+ this(key, null, value);
}
public static Filter as(String key, Relation relation, Object... value) {
diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java
index 9f4a7af9..c81cec33 100644
--- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java
+++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java
@@ -1,25 +1,25 @@
package com.codingapi.springboot.framework.dto.request;
-import jakarta.servlet.http.HttpServletRequest;
import lombok.Getter;
+import lombok.Setter;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Optional;
public class PageRequest extends org.springframework.data.domain.PageRequest {
@Getter
+ @Setter
private int current;
+
+ @Setter
+ @Getter
private int pageSize;
@Getter
private final RequestFilter requestFilter = new RequestFilter();
- @Getter
- private HttpServletRequest servletRequest;
private org.springframework.data.domain.PageRequest pageRequest;
@@ -28,13 +28,6 @@ public PageRequest(int current, int pageSize, Sort sort) {
this.current = current;
this.pageSize = pageSize;
this.pageRequest = org.springframework.data.domain.PageRequest.of(current, pageSize, sort);
-
- try {
- ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
- this.servletRequest = attributes.getRequest();
- requestFilter.syncParameter(servletRequest);
- } catch (Exception e) {
- }
}
@@ -42,29 +35,6 @@ public PageRequest() {
this(0, 20, Sort.unsorted());
}
- public void setCurrent(int current) {
- this.current = current > 0 ? current - 1 : 0;
- this.requestFilter.deleteFilter("current");
- }
-
- public String getParameter(String key) {
- return servletRequest.getParameter(key);
- }
-
- public String getParameter(String key, String defaultValue) {
- String result = servletRequest.getParameter(key);
- return result == null ? defaultValue : result;
- }
-
- public int getIntParameter(String key) {
- return Integer.parseInt(servletRequest.getParameter(key));
- }
-
- public int getIntParameter(String key, int defaultValue) {
- String result = servletRequest.getParameter(key);
- return result == null ? defaultValue : Integer.parseInt(result);
- }
-
public String getStringFilter(String key) {
return requestFilter.getStringFilter(key);
}
@@ -85,15 +55,6 @@ public boolean hasFilter() {
return requestFilter.hasFilter();
}
- @Override
- public int getPageSize() {
- return pageSize;
- }
-
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- this.requestFilter.deleteFilter("pageSize");
- }
@Override
public Sort getSort() {
@@ -164,7 +125,7 @@ public void addSort(Sort sort) {
}
}
- public PageRequest andFilter(String key, Relation relation, Object... value) {
+ public PageRequest addFilter(String key, Relation relation, Object... value) {
requestFilter.addFilter(key, relation, value);
return this;
}
@@ -174,8 +135,8 @@ public PageRequest addFilter(String key, Object... value) {
return this;
}
- public PageRequest andFilter(Filter... value) {
- requestFilter.andFilters(value);
+ public PageRequest andFilter(Filter... filters) {
+ requestFilter.andFilters(filters);
return this;
}
diff --git a/springboot-starter/src/test/java/com/codingapi/springboot/framework/dto/request/PageRequestTest.java b/springboot-starter/src/test/java/com/codingapi/springboot/framework/dto/request/PageRequestTest.java
index e3584bfa..93028dd8 100644
--- a/springboot-starter/src/test/java/com/codingapi/springboot/framework/dto/request/PageRequestTest.java
+++ b/springboot-starter/src/test/java/com/codingapi/springboot/framework/dto/request/PageRequestTest.java
@@ -9,7 +9,7 @@ class PageRequestTest {
@Test
void test(){
PageRequest pageRequest = new PageRequest();
- pageRequest.setCurrent(2);
+ pageRequest.setCurrent(1);
pageRequest.setPageSize(10);
assertEquals(pageRequest.getCurrent(),1);
diff --git a/springboot-starter/src/test/java/com/codingapi/springboot/framework/query/test/DemoRepositoryTest.java b/springboot-starter/src/test/java/com/codingapi/springboot/framework/query/test/DemoRepositoryTest.java
index 6a1c31bd..e1dff7ec 100644
--- a/springboot-starter/src/test/java/com/codingapi/springboot/framework/query/test/DemoRepositoryTest.java
+++ b/springboot-starter/src/test/java/com/codingapi/springboot/framework/query/test/DemoRepositoryTest.java
@@ -43,7 +43,7 @@ void query(){
demoRepository.save(demo2);
PageRequest request = new PageRequest();
- request.setCurrent(1);
+ request.setCurrent(0);
request.setPageSize(10);
@@ -67,7 +67,7 @@ void sort(){
demoRepository.save(demo2);
PageRequest request = new PageRequest();
- request.setCurrent(1);
+ request.setCurrent(0);
request.setPageSize(10);
request.addSort(Sort.by("id").descending());
From cc680a6f2a3c9b846ee10f9e1c8d53d7db75f3dc Mon Sep 17 00:00:00 2001
From: lorne <1991wangliang@gmail.com>
Date: Sat, 6 Jan 2024 00:34:06 +0800
Subject: [PATCH 02/10] add SearchRequest
---
...DynamicRequest.java => DynamicSQLBuilder.java} | 15 ++++++++++-----
.../{ExampleRequest.java => ExampleBuilder.java} | 7 +++++--
.../fast/jpa/repository/FastRepository.java | 13 +++++++++----
.../fast/jpa/repository/SearchRequest.java | 10 ++++++----
4 files changed, 30 insertions(+), 15 deletions(-)
rename springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/{DynamicRequest.java => DynamicSQLBuilder.java} (94%)
rename springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/{ExampleRequest.java => ExampleBuilder.java} (92%)
diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicSQLBuilder.java
similarity index 94%
rename from springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRequest.java
rename to springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicSQLBuilder.java
index f6be561c..06705ad8 100644
--- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicRequest.java
+++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/jpa/repository/DynamicSQLBuilder.java
@@ -3,13 +3,18 @@
import com.codingapi.springboot.framework.dto.request.Filter;
import com.codingapi.springboot.framework.dto.request.PageRequest;
import com.codingapi.springboot.framework.dto.request.RequestFilter;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-public class DynamicRequest {
+/**
+ * 动态条件查询组装
+ */
+@Slf4j
+class DynamicSQLBuilder {
private final PageRequest request;
private final Class> clazz;
@@ -17,13 +22,13 @@ public class DynamicRequest {
private final List