From 142b57975b205e522ed3c951e19437b3404831d5 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Tue, 6 Jan 2026 14:24:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor(common):=20=E5=B0=86=E5=8C=85=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BB=8E=20jpa=20=E8=BF=81=E7=A7=BB=E8=87=B3=20common?= =?UTF-8?q?=20=E5=B9=B6=E9=87=8D=E6=9E=84=E6=A0=B8=E5=BF=83=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将所有控制器接口从 jpa 包迁移至 common 包 - 将 GlobalResponse、Query、Page 等核心类重构为 record 类型 - 移除 Lombok 依赖并简化代码结构 - 更新 SimpleService 接口以支持更通用的实体类型 - 调整 SimpleControllerSupport 和 SimpleServiceSupport 以适配新的 API - 清理 web 模块的 pom.xml 中的冗余依赖和配置 --- .../common}/controller/DetailController.java | 2 +- .../common}/controller/GlobalResponse.java | 33 +-- .../common}/controller/ListController.java | 2 +- .../template/common/controller/Query.java | 133 ++++++++++ .../common}/controller/RemoveController.java | 2 +- .../common}/controller/SaveController.java | 2 +- .../common}/controller/SimpleController.java | 2 +- .../service/template/common/service/Page.java | 12 + .../common}/service/SimpleService.java | 8 +- .../template/jpa/controller/Query.java | 247 ------------------ .../controller/SimpleControllerSupport.java | 8 +- .../jpa/service/SimpleServiceSupport.java | 118 +++++---- spring-boot-service-template-web/pom.xml | 30 +++ 13 files changed, 255 insertions(+), 344 deletions(-) rename {spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa => spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common}/controller/DetailController.java (90%) rename {spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa => spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common}/controller/GlobalResponse.java (72%) rename {spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa => spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common}/controller/ListController.java (97%) create mode 100644 spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/Query.java rename {spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa => spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common}/controller/RemoveController.java (89%) rename {spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa => spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common}/controller/SaveController.java (91%) rename {spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa => spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common}/controller/SimpleController.java (74%) create mode 100644 spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/service/Page.java rename {spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa => spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common}/service/SimpleService.java (63%) delete mode 100644 spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/Query.java create mode 100644 spring-boot-service-template-web/pom.xml diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/DetailController.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/DetailController.java similarity index 90% rename from spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/DetailController.java rename to spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/DetailController.java index 94bba5f..f065436 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/DetailController.java +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/DetailController.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.jpa.controller; +package com.lanyuanxiaoyao.service.template.common.controller; /** * 详情控制器接口,用于定义统一的获取实体详情的接口规范 diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/GlobalResponse.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/GlobalResponse.java similarity index 72% rename from spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/GlobalResponse.java rename to spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/GlobalResponse.java index df24b6a..0a579a2 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/GlobalResponse.java +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/GlobalResponse.java @@ -1,42 +1,23 @@ -package com.lanyuanxiaoyao.service.template.jpa.controller; +package com.lanyuanxiaoyao.service.template.common.controller; import java.util.Map; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; -@Setter -@Getter -@ToString -public class GlobalResponse { +public record GlobalResponse( + Integer status, + String message, + T data +) { private static final int SUCCESS_STATUS = 0; private static final int ERROR_STATUS = 500; private static final String SUCCESS_MESSAGE = "OK"; private static final String ERROR_MESSAGE = "ERROR"; - private Integer status; - private String message; - private T data; - - private GlobalResponse() { - this(SUCCESS_STATUS, SUCCESS_MESSAGE, null); - } - - private GlobalResponse(Integer status, String message) { - this(status, message, null); - } - - private GlobalResponse(Integer status, String message, T data) { - this.status = status; - this.message = message; - this.data = data; - } public static GlobalResponse responseError() { return responseError(ERROR_MESSAGE); } public static GlobalResponse responseError(String message) { - return new GlobalResponse<>(ERROR_STATUS, message); + return new GlobalResponse<>(ERROR_STATUS, message, null); } public static GlobalResponse responseSuccess() { diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/ListController.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/ListController.java similarity index 97% rename from spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/ListController.java rename to spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/ListController.java index 7f6d5a1..d34a878 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/ListController.java +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/ListController.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.jpa.controller; +package com.lanyuanxiaoyao.service.template.common.controller; import java.util.Map; diff --git a/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/Query.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/Query.java new file mode 100644 index 0000000..be34952 --- /dev/null +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/Query.java @@ -0,0 +1,133 @@ +package com.lanyuanxiaoyao.service.template.common.controller; + +import java.util.List; +import java.util.Map; + +/** + * 查询条件封装类,用于构建复杂的查询条件 + * 包含查询条件、排序条件和分页条件 + * + *

前端传入的JSON格式示例:

+ *
+ * {
+ *   "query": {
+ *     "equal": {
+ *       "name": "张三"
+ *     },
+ *     "like": {
+ *       "address": "%北京%"
+ *     },
+ *     "greatEqual": {
+ *       "age": 18
+ *     },
+ *     "less": {
+ *       "age": 60
+ *     },
+ *     "between": {
+ *       "salary": {
+ *         "start": 5000,
+ *         "end": 10000
+ *       }
+ *     }
+ *   },
+ *   "sort": [
+ *     {
+ *       "column": "createTime",
+ *       "direction": "DESC"
+ *     }
+ *   ],
+ *   "page": {
+ *     "index": 0,
+ *     "size": 10
+ *   }
+ * }
+ * 
+ * + *

查询条件说明:

+ *
    + *
  • nullEqual: 字段值为null的条件
  • + *
  • notNullEqual: 字段值不为null的条件
  • + *
  • empty: 字段值为空的条件
  • + *
  • notEmpty: 字段值不为空的条件
  • + *
  • equal: 字段值相等的条件
  • + *
  • notEqual: 字段值不相等的条件
  • + *
  • like: 字段值模糊匹配的条件
  • + *
  • notLike: 字段值不模糊匹配的条件
  • + *
  • great: 字段值大于的条件
  • + *
  • less: 字段值小于的条件
  • + *
  • greatEqual: 字段值大于等于的条件
  • + *
  • lessEqual: 字段值小于等于的条件
  • + *
  • in: 字段值在指定范围内的条件
  • + *
  • notIn: 字段值不在指定范围内的条件
  • + *
  • between: 字段值在指定区间内的条件
  • + *
  • notBetween: 字段值不在指定区间内的条件
  • + *
+ */ +public record Query( + Queryable query, + List sort, + Pageable page +) { + /** + * 可查询条件类,封装各种查询条件 + */ + public record Queryable( + List nullEqual, + List notNullEqual, + List empty, + List notEmpty, + Map equal, + Map notEqual, + Map like, + Map notLike, + Map contain, + Map notContain, + Map startWith, + Map notStartWith, + Map endWith, + Map notEndWith, + Map great, + Map less, + Map greatEqual, + Map lessEqual, + Map> inside, + Map> notInside, + Map between, + Map notBetween + ) { + /** + * 区间范围类,用于表示起始值和结束值 + */ + public record Between( + Object start, + Object end + ) { + } + } + + + public record Sortable( + String column, + Direction direction + ) { + public enum Direction { + /** + * 升序排列 + */ + ASC, + /** + * 降序排列 + */ + DESC, + } + } + + /** + * 可分页条件类,用于指定分页参数 + */ + public record Pageable( + Integer index, + Integer size + ) { + } +} \ No newline at end of file diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/RemoveController.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/RemoveController.java similarity index 89% rename from spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/RemoveController.java rename to spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/RemoveController.java index 05d7e92..0e9c6da 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/RemoveController.java +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/RemoveController.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.jpa.controller; +package com.lanyuanxiaoyao.service.template.common.controller; /** * 删除控制器接口,用于定义统一的删除实体对象的接口规范 diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SaveController.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/SaveController.java similarity index 91% rename from spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SaveController.java rename to spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/SaveController.java index 62c7091..44b28da 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SaveController.java +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/SaveController.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.jpa.controller; +package com.lanyuanxiaoyao.service.template.common.controller; /** * 保存控制器接口,用于定义统一的保存实体对象的接口规范 diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SimpleController.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/SimpleController.java similarity index 74% rename from spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SimpleController.java rename to spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/SimpleController.java index 4485642..3dc771b 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SimpleController.java +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/controller/SimpleController.java @@ -1,4 +1,4 @@ -package com.lanyuanxiaoyao.service.template.jpa.controller; +package com.lanyuanxiaoyao.service.template.common.controller; public interface SimpleController extends SaveController, ListController, DetailController, RemoveController { } diff --git a/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/service/Page.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/service/Page.java new file mode 100644 index 0000000..7ccf4fd --- /dev/null +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/service/Page.java @@ -0,0 +1,12 @@ +package com.lanyuanxiaoyao.service.template.common.service; + +import java.util.stream.Stream; + +/** + * 分页 + * + * @author lanyuanxiaoyao + * @version 20260106 + */ +public record Page(Stream items, long total) { +} diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/service/SimpleService.java b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/service/SimpleService.java similarity index 63% rename from spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/service/SimpleService.java rename to spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/service/SimpleService.java index afdb8ed..de02767 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/service/SimpleService.java +++ b/spring-boot-service-template-common/src/main/java/com/lanyuanxiaoyao/service/template/common/service/SimpleService.java @@ -1,12 +1,10 @@ -package com.lanyuanxiaoyao.service.template.jpa.service; +package com.lanyuanxiaoyao.service.template.common.service; -import com.lanyuanxiaoyao.service.template.jpa.controller.Query; -import com.lanyuanxiaoyao.service.template.jpa.entity.SimpleEntity; +import com.lanyuanxiaoyao.service.template.common.controller.Query; import java.util.List; import java.util.Set; -import org.springframework.data.domain.Page; -public interface SimpleService { +public interface SimpleService { Long save(ENTITY entity) throws Exception; void save(Iterable entities) throws Exception; diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/Query.java b/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/Query.java deleted file mode 100644 index 7665758..0000000 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/Query.java +++ /dev/null @@ -1,247 +0,0 @@ -package com.lanyuanxiaoyao.service.template.jpa.controller; - -import java.util.List; -import java.util.Map; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -/** - * 查询条件封装类,用于构建复杂的查询条件 - * 包含查询条件、排序条件和分页条件 - * - *

前端传入的JSON格式示例:

- *
- * {
- *   "query": {
- *     "equal": {
- *       "name": "张三"
- *     },
- *     "like": {
- *       "address": "%北京%"
- *     },
- *     "greatEqual": {
- *       "age": 18
- *     },
- *     "less": {
- *       "age": 60
- *     },
- *     "between": {
- *       "salary": {
- *         "start": 5000,
- *         "end": 10000
- *       }
- *     }
- *   },
- *   "sort": [
- *     {
- *       "column": "createTime",
- *       "direction": "DESC"
- *     }
- *   ],
- *   "page": {
- *     "index": 0,
- *     "size": 10
- *   }
- * }
- * 
- * - *

查询条件说明:

- *
    - *
  • nullEqual: 字段值为null的条件
  • - *
  • notNullEqual: 字段值不为null的条件
  • - *
  • empty: 字段值为空的条件
  • - *
  • notEmpty: 字段值不为空的条件
  • - *
  • equal: 字段值相等的条件
  • - *
  • notEqual: 字段值不相等的条件
  • - *
  • like: 字段值模糊匹配的条件
  • - *
  • notLike: 字段值不模糊匹配的条件
  • - *
  • great: 字段值大于的条件
  • - *
  • less: 字段值小于的条件
  • - *
  • greatEqual: 字段值大于等于的条件
  • - *
  • lessEqual: 字段值小于等于的条件
  • - *
  • in: 字段值在指定范围内的条件
  • - *
  • notIn: 字段值不在指定范围内的条件
  • - *
  • between: 字段值在指定区间内的条件
  • - *
  • notBetween: 字段值不在指定区间内的条件
  • - *
- */ -@Setter -@Getter -@ToString -public class Query { - /** - * 查询条件 - */ - private Queryable query; - /** - * 排序条件列表 - */ - private List sort; - /** - * 分页条件 - */ - private Pageable page; - - /** - * 可查询条件类,封装各种查询条件 - */ - @Setter - @Getter - @ToString - public static class Queryable { - /** - * 指定字段值为null的条件列表 - */ - private List nullEqual; - /** - * 指定字段值不为null的条件列表 - */ - private List notNullEqual; - /** - * 指定字段值为空的条件列表(如空字符串、空集合等) - */ - private List empty; - /** - * 指定字段值不为空的条件列表 - */ - private List notEmpty; - /** - * 指定字段值相等的条件映射(字段名 -> 值) - */ - private Map equal; - /** - * 指定字段值不相等的条件映射(字段名 -> 值) - */ - private Map notEqual; - /** - * 指定字段模糊匹配的条件映射(字段名 -> 匹配值) - */ - private Map like; - /** - * 指定字段不模糊匹配的条件映射(字段名 -> 匹配值) - */ - private Map notLike; - /** - * 指定字段包含指定字符串的条件映射(字段名 -> 包含值) - */ - private Map contain; - /** - * 指定字段不包含指定字符串的条件映射(字段名 -> 不包含值) - */ - private Map notContain; - /** - * 指定字段以指定字符串开头的条件映射(字段名 -> 开头值) - */ - private Map startWith; - /** - * 指定字段不以指定字符串开头的条件映射(字段名 -> 不开头值) - */ - private Map notStartWith; - /** - * 指定字段以指定字符串结尾的条件映射(字段名 -> 结尾值) - */ - private Map endWith; - /** - * 指定字段不以指定字符串结尾的条件映射(字段名 -> 不结尾值) - */ - private Map notEndWith; - /** - * 指定字段大于条件的映射(字段名 -> 值) - */ - private Map great; - /** - * 指定字段小于条件的映射(字段名 -> 值) - */ - private Map less; - /** - * 指定字段大于等于条件的映射(字段名 -> 值) - */ - private Map greatEqual; - /** - * 指定字段小于等于条件的映射(字段名 -> 值) - */ - private Map lessEqual; - /** - * 指定字段值在指定范围内的条件映射(字段名 -> 值列表) - */ - private Map> inside; - /** - * 指定字段值不在指定范围内的条件映射(字段名 -> 值列表) - */ - private Map> notInside; - /** - * 指定字段值在指定区间内的条件映射(字段名 -> 区间范围) - */ - private Map between; - /** - * 指定字段值不在指定区间内的条件映射(字段名 -> 区间范围) - */ - private Map notBetween; - - /** - * 区间范围类,用于表示起始值和结束值 - */ - @Setter - @Getter - @ToString - public static class Between { - /** - * 起始值 - */ - private Object start; - /** - * 结束值 - */ - private Object end; - } - } - - /** - * 可排序条件类,用于指定排序字段和排序方向 - */ - @Setter - @Getter - @ToString - public static class Sortable { - /** - * 排序字段名 - */ - private String column; - /** - * 排序方向 - */ - private Direction direction; - - /** - * 排序方向枚举 - */ - public enum Direction { - /** - * 升序排列 - */ - ASC, - /** - * 降序排列 - */ - DESC, - } - } - - /** - * 可分页条件类,用于指定分页参数 - */ - @Setter - @Getter - @ToString - public static class Pageable { - /** - * 页码索引(从0开始) - */ - private Integer index; - /** - * 每页大小 - */ - private Integer size; - } -} \ No newline at end of file diff --git a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SimpleControllerSupport.java b/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SimpleControllerSupport.java index e8f9355..8f382e1 100644 --- a/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SimpleControllerSupport.java +++ b/spring-boot-service-template-jpa/src/main/java/com/lanyuanxiaoyao/service/template/jpa/controller/SimpleControllerSupport.java @@ -1,5 +1,7 @@ package com.lanyuanxiaoyao.service.template.jpa.controller; +import com.lanyuanxiaoyao.service.template.common.controller.GlobalResponse; +import com.lanyuanxiaoyao.service.template.common.controller.SimpleController; import com.lanyuanxiaoyao.service.template.common.helper.ObjectHelper; import com.lanyuanxiaoyao.service.template.jpa.entity.SimpleEntity; import com.lanyuanxiaoyao.service.template.jpa.service.SimpleServiceSupport; @@ -158,14 +160,14 @@ public abstract class SimpleControllerSupport> list(@RequestBody Query query) throws Exception { + public GlobalResponse> list(@RequestBody com.lanyuanxiaoyao.service.template.common.controller.Query query) throws Exception { if (ObjectHelper.isNull(query)) { return GlobalResponse.responseCrudData(List.of(), 0); } var mapper = listItemMapper(); var result = service.list(query); return GlobalResponse.responseCrudData( - result.get() + result.items() .map(entity -> { try { return mapper.apply(entity); @@ -174,7 +176,7 @@ public abstract class SimpleControllerSupport implemen if (ObjectHelper.isNull(queryable)) { return null; } - if (ObjectHelper.isNotEmpty(queryable.getNullEqual())) { - queryable.getNullEqual().forEach(column -> predicates.add(builder.isNull(column(root, column)))); + if (ObjectHelper.isNotEmpty(queryable.nullEqual())) { + queryable.nullEqual().forEach(column -> predicates.add(builder.isNull(column(root, column)))); } - if (ObjectHelper.isNotEmpty(queryable.getNotNullEqual())) { - queryable.getNotNullEqual().forEach(column -> predicates.add(builder.isNotNull(column(root, column)))); + if (ObjectHelper.isNotEmpty(queryable.notNullEqual())) { + queryable.notNullEqual().forEach(column -> predicates.add(builder.isNotNull(column(root, column)))); } - if (ObjectHelper.isNotEmpty(queryable.getEmpty())) { - queryable.getEmpty().forEach(column -> { + if (ObjectHelper.isNotEmpty(queryable.empty())) { + queryable.empty().forEach(column -> { var path = this.>column(root, column); checkCollection(path, column); predicates.add(builder.isEmpty(path)); }); } - if (ObjectHelper.isNotEmpty(queryable.getNotEmpty())) { - queryable.getNotEmpty().forEach(column -> { + if (ObjectHelper.isNotEmpty(queryable.notEmpty())) { + queryable.notEmpty().forEach(column -> { var path = this.>column(root, column); checkCollection(path, column); predicates.add(builder.isNotEmpty(path)); }); } - if (ObjectHelper.isNotEmpty(queryable.getEqual())) { - queryable.getEqual().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.equal())) { + queryable.equal().forEach((column, value) -> { var path = column(root, column); predicates.add(builder.equal(path, value(path, value))); }); } - if (ObjectHelper.isNotEmpty(queryable.getNotEqual())) { - queryable.getNotEqual().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.notEqual())) { + queryable.notEqual().forEach((column, value) -> { var path = column(root, column); predicates.add(builder.notEqual(path, value(path, value))); }); } - if (ObjectHelper.isNotEmpty(queryable.getLike())) { - queryable.getLike().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.like())) { + queryable.like().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.like(path, value)); }); } - if (ObjectHelper.isNotEmpty(queryable.getNotLike())) { - queryable.getNotLike().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.notLike())) { + queryable.notLike().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.notLike(path, value)); }); } - if (ObjectHelper.isNotEmpty(queryable.getContain())) { - queryable.getContain().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.contain())) { + queryable.contain().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.like(path, "%" + value + "%")); }); } - if (ObjectHelper.isNotEmpty(queryable.getNotContain())) { - queryable.getNotContain().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.notContain())) { + queryable.notContain().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.notLike(path, "%" + value + "%")); }); } - if (ObjectHelper.isNotEmpty(queryable.getStartWith())) { - queryable.getStartWith().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.startWith())) { + queryable.startWith().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.like(path, value + "%")); }); } - if (ObjectHelper.isNotEmpty(queryable.getNotStartWith())) { - queryable.getNotStartWith().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.notStartWith())) { + queryable.notStartWith().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.notLike(path, value + "%")); }); } - if (ObjectHelper.isNotEmpty(queryable.getEndWith())) { - queryable.getEndWith().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.endWith())) { + queryable.endWith().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.like(path, "%" + value)); }); } - if (ObjectHelper.isNotEmpty(queryable.getNotEndWith())) { - queryable.getNotEndWith().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.notEndWith())) { + queryable.notEndWith().forEach((column, value) -> { var path = this.column(root, column); checkString(path, value, column); predicates.add(builder.notLike(path, "%" + value)); }); } - if (ObjectHelper.isNotEmpty(queryable.getGreat())) { - queryable.getGreat().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.great())) { + queryable.great().forEach((column, value) -> { var path = this.>column(root, column); checkComparable(path, value, column); predicates.add(builder.greaterThan(path, (Comparable) value(path, value))); }); } - if (ObjectHelper.isNotEmpty(queryable.getLess())) { - queryable.getLess().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.less())) { + queryable.less().forEach((column, value) -> { var path = this.>column(root, column); checkComparable(path, value, column); predicates.add(builder.lessThan(path, (Comparable) value(path, value))); }); } - if (ObjectHelper.isNotEmpty(queryable.getGreatEqual())) { - queryable.getGreatEqual().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.greatEqual())) { + queryable.greatEqual().forEach((column, value) -> { var path = this.>column(root, column); checkComparable(path, value, column); predicates.add(builder.greaterThanOrEqualTo(path, (Comparable) value(path, value))); }); } - if (ObjectHelper.isNotEmpty(queryable.getLessEqual())) { - queryable.getLessEqual().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.lessEqual())) { + queryable.lessEqual().forEach((column, value) -> { var path = this.>column(root, column); checkComparable(path, value, column); predicates.add(builder.lessThanOrEqualTo(path, (Comparable) value(path, value))); }); } - if (ObjectHelper.isNotEmpty(queryable.getInside())) { - queryable.getInside() + if (ObjectHelper.isNotEmpty(queryable.inside())) { + queryable.inside() .entrySet() .stream() .filter(entry -> ObjectHelper.isNotEmpty(entry.getValue())) .forEach(entry -> predicates.add(builder.in(column(root, entry.getKey())).value(entry.getValue()))); } - if (ObjectHelper.isNotEmpty(queryable.getNotInside())) { - queryable.getNotInside() + if (ObjectHelper.isNotEmpty(queryable.notInside())) { + queryable.notInside() .entrySet() .stream() .filter(entry -> ObjectHelper.isNotEmpty(entry.getValue())) .forEach(entry -> predicates.add(builder.in(column(root, entry.getKey())).value(entry.getValue()).not())); } - if (ObjectHelper.isNotEmpty(queryable.getBetween())) { - queryable.getBetween().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.between())) { + queryable.between().forEach((column, value) -> { var path = this.>column(root, column); checkComparable(path, value, column); - predicates.add(builder.between(path, (Comparable) value(path, value.getStart()), (Comparable) value(path, value.getEnd()))); + predicates.add(builder.between(path, (Comparable) value(path, value.start()), (Comparable) value(path, value.end()))); }); } - if (ObjectHelper.isNotEmpty(queryable.getNotBetween())) { - queryable.getNotBetween().forEach((column, value) -> { + if (ObjectHelper.isNotEmpty(queryable.notBetween())) { + queryable.notBetween().forEach((column, value) -> { var path = this.>column(root, column); checkComparable(path, value, column); - predicates.add(builder.between(path, (Comparable) value(path, value.getStart()), (Comparable) value(path, value.getEnd())).not()); + predicates.add(builder.between(path, (Comparable) value(path, value.start()), (Comparable) value(path, value.end())).not()); }); } @@ -438,8 +439,8 @@ public abstract class SimpleServiceSupport implemen * @throws NotComparableException 当区间值不可比较时抛出 */ private void checkComparable(Path path, Query.Queryable.Between value, String column) { - checkComparable(path, value.getStart(), column); - checkComparable(path, value.getEnd(), column); + checkComparable(path, value.start(), column); + checkComparable(path, value.end(), column); } /** @@ -510,30 +511,31 @@ public abstract class SimpleServiceSupport implemen @Override public Page list(Query listQuery) { var pageRequest = PageRequest.of(DEFAULT_PAGE_INDEX - 1, DEFAULT_PAGE_SIZE, Sort.by(SimpleEntity.Fields.createdTime).descending()); - if (ObjectHelper.isNotNull(listQuery.getPage())) { - var index = Math.max(ObjectHelper.defaultIfNull(listQuery.getPage().getIndex(), DEFAULT_PAGE_INDEX) - 1, 0); - var size = Math.max(ObjectHelper.defaultIfNull(listQuery.getPage().getSize(), DEFAULT_PAGE_SIZE), 1); - if (ObjectHelper.isNotEmpty(listQuery.getSort())) { + if (ObjectHelper.isNotNull(listQuery.page())) { + var index = Math.max(ObjectHelper.defaultIfNull(listQuery.page().index(), DEFAULT_PAGE_INDEX) - 1, 0); + var size = Math.max(ObjectHelper.defaultIfNull(listQuery.page().size(), DEFAULT_PAGE_SIZE), 1); + if (ObjectHelper.isNotEmpty(listQuery.sort())) { pageRequest = PageRequest.of(index, size, Sort.by( - listQuery.getSort() + listQuery.sort() .stream() - .map(sort -> new Sort.Order(Sort.Direction.fromString(sort.getDirection().name()), sort.getColumn())) + .map(sort -> new Sort.Order(Sort.Direction.fromString(sort.direction().name()), sort.column())) .toList() )); } else { pageRequest = PageRequest.of(index, size, Sort.by(SimpleEntity.Fields.createdTime).descending()); } } - return repository.findAll( + var result = repository.findAll( (root, query, builder) -> { var predicate = listPredicate(root, query, builder); - var queryPredicate = queryPredicates(listQuery.getQuery(), root, query, builder); + var queryPredicate = queryPredicates(listQuery.query(), root, query, builder); return ObjectHelper.isNull(predicate) ? queryPredicate : builder.and(predicate, queryPredicate); }, pageRequest ); + return new Page<>(result.get(), result.getTotalElements()); } /** diff --git a/spring-boot-service-template-web/pom.xml b/spring-boot-service-template-web/pom.xml new file mode 100644 index 0000000..62dd1da --- /dev/null +++ b/spring-boot-service-template-web/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.lanyuanxiaoyao + spring-boot-service-template + 1.1.0-SNAPSHOT + + + spring-boot-service-template-web + + + + + org.apache.maven.plugins + maven-source-plugin + + + package + + jar-no-fork + + + + + + + \ No newline at end of file