From 75c8f556a894074d0665c131daa896ecf7f5a908 Mon Sep 17 00:00:00 2001 From: Timi Date: Mon, 8 Dec 2025 16:56:41 +0800 Subject: [PATCH] support equals or like Example for page --- .../java/com/imyeyu/spring/bean/Page.java | 34 +++++---- .../com/imyeyu/spring/mapper/BaseMapper.java | 6 +- .../spring/service/AbstractEntityService.java | 2 +- .../spring/service/PageableService.java | 2 +- .../com/imyeyu/spring/util/SQLProvider.java | 71 +++++++++++++------ 5 files changed, 76 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/imyeyu/spring/bean/Page.java b/src/main/java/com/imyeyu/spring/bean/Page.java index d0dbc24..6340c45 100644 --- a/src/main/java/com/imyeyu/spring/bean/Page.java +++ b/src/main/java/com/imyeyu/spring/bean/Page.java @@ -13,12 +13,14 @@ import java.util.LinkedHashMap; * @author 夜雨 * @version 2023-06-02 14:47 */ -public class Page extends BasePage { +public class Page extends BasePage { + + protected T equalsExample; + + protected T likeExample; protected LinkedHashMap orderMap; - protected LinkedHashMap likeMap; - public Page() { } @@ -30,10 +32,26 @@ public class Page extends BasePage { return (long) index * size; } - public int getLimit() { + public long getLimit() { return size; } + public T getEqualsExample() { + return equalsExample; + } + + public void setEqualsExample(T equalsExample) { + this.equalsExample = equalsExample; + } + + public T getLikeExample() { + return likeExample; + } + + public void setLikeExample(T likeExample) { + this.likeExample = likeExample; + } + public LinkedHashMap getOrderMap() { return orderMap; } @@ -46,12 +64,4 @@ public class Page extends BasePage { orderMap = TimiJava.firstNotNull(orderMap, new LinkedHashMap<>()); orderMap.put(Text.camelCase2underscore(field), orderType); } - - public LinkedHashMap getLikeMap() { - return likeMap; - } - - public void setLikeMap(LinkedHashMap likeMap) { - this.likeMap = likeMap; - } } diff --git a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java index 7121491..5475b19 100644 --- a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java +++ b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java @@ -47,7 +47,7 @@ public interface BaseMapper { * @return 数据列表 */ @SelectProvider(type = SQLProvider.class, method = "listByPage") - List listByPage(Page page); + List listByPage(Page page); /** * 根据 Page 对象统计数据量 @@ -56,7 +56,7 @@ public interface BaseMapper { * @return 数据量 */ @SelectProvider(type = SQLProvider.class, method = "countByPage") - long countByPage(Page page); + long countByPage(Page page); /** * 分页查询 @@ -64,7 +64,7 @@ public interface BaseMapper { * @param page 分页参数 * @return 分页结果 */ - default PageResult page(Page page) { + default PageResult page(Page page) { PageResult result = new PageResult<>(); result.setTotal(countByPage(page)); result.setList(listByPage(page)); diff --git a/src/main/java/com/imyeyu/spring/service/AbstractEntityService.java b/src/main/java/com/imyeyu/spring/service/AbstractEntityService.java index 8ce5cc9..09335bc 100644 --- a/src/main/java/com/imyeyu/spring/service/AbstractEntityService.java +++ b/src/main/java/com/imyeyu/spring/service/AbstractEntityService.java @@ -33,7 +33,7 @@ public abstract class AbstractEntityService implements BaseService { } @Override - public PageResult page(Page page) { + public PageResult page(Page page) { checkMapper(); return baseMapper.page(page); } diff --git a/src/main/java/com/imyeyu/spring/service/PageableService.java b/src/main/java/com/imyeyu/spring/service/PageableService.java index 488469c..073e6cc 100644 --- a/src/main/java/com/imyeyu/spring/service/PageableService.java +++ b/src/main/java/com/imyeyu/spring/service/PageableService.java @@ -18,5 +18,5 @@ public interface PageableService { * @param page 页面查询参数 * @return 查询页面结果 */ - PageResult page(Page page); + PageResult page(Page page); } diff --git a/src/main/java/com/imyeyu/spring/util/SQLProvider.java b/src/main/java/com/imyeyu/spring/util/SQLProvider.java index 3ba199c..feb0358 100644 --- a/src/main/java/com/imyeyu/spring/util/SQLProvider.java +++ b/src/main/java/com/imyeyu/spring/util/SQLProvider.java @@ -50,25 +50,34 @@ public class SQLProvider { * @param page 分页参数 * @return SQL */ - public String listByPage(ProviderContext context, @Param("page") Page page) { + public String listByPage(ProviderContext context, @Param("page") Page page) { EntityMeta meta = getEntityMeta(context); StringBuilder sql = new StringBuilder(); sql.append("SELECT %s FROM `%s` WHERE 1 = 1".formatted(meta.selectAllClause, meta.table)); - - // 处理软删除 if (meta.canDelete) { sql.append(" AND (`deleted_at` IS NULL OR %s < `deleted_at`)".formatted(Time.now())); } - // 处理模糊查询 - if (TimiJava.isNotEmpty(page.getLikeMap())) { - for (Map.Entry item : page.getLikeMap().entrySet()) { - sql.append(" AND `%s` LIKE CONCAT('%%', #{likeMap.%s}, '%%')".formatted( - Text.camelCase2underscore(item.getKey()), - item.getKey() - )); - } + if (TimiJava.isNotEmpty(page.getEqualsExample())) { + // 精准查询 + Object obj = page.getEqualsExample(); + EntityMeta metaExample = getEntityMeta(obj.getClass()); + String conditionClause = metaExample.fieldColumnList.stream() + .filter(fc -> fc.isNotNull(obj)) + .map(fc -> "`%s` = '%s'".formatted(fc.columnName, fc.getAsString(obj))) + .collect(Collectors.joining(" AND ")); + sql.append(conditionClause); } - // 处理排序 + if (TimiJava.isNotEmpty(page.getLikeExample())) { + // 模糊查询 + Object obj = page.getLikeExample(); + EntityMeta metaExample = getEntityMeta(obj.getClass()); + String conditionClause = metaExample.fieldColumnList.stream() + .filter(fc -> fc.isNotNull(obj)) + .map(fc -> "`%s` LIKE CONCAT('%%', '%s', '%%')".formatted(fc.columnName, fc.getAsString(obj))) + .collect(Collectors.joining(" AND ")); + sql.append(conditionClause); + } + // 排序 if (TimiJava.isNotEmpty(page.getOrderMap())) { sql.append(" ORDER BY "); for (Map.Entry item : page.getOrderMap().entrySet()) { @@ -99,22 +108,32 @@ public class SQLProvider { * @param page 分页参数 * @return SQL */ - public String countByPage(ProviderContext context, @Param("page") com.imyeyu.spring.bean.Page page) { + public String countByPage(ProviderContext context, @Param("page") Page page) { EntityMeta meta = getEntityMeta(context); StringBuilder sql = new StringBuilder(); sql.append("SELECT COUNT(*) FROM `%s` WHERE 1 = 1".formatted(meta.table)); - // 处理软删除 if (meta.canDelete) { sql.append(" AND (`deleted_at` IS NULL OR %s < `deleted_at`)".formatted(Time.now())); } - // 处理模糊查询 - if (TimiJava.isNotEmpty(page.getLikeMap())) { - for (Map.Entry item : page.getLikeMap().entrySet()) { - sql.append(" AND `%s` LIKE CONCAT('%%', #{likeMap.%s}, '%%')".formatted( - Text.camelCase2underscore(item.getKey()), - item.getKey() - )); - } + if (TimiJava.isNotEmpty(page.getEqualsExample())) { + // 精准查询 + Object obj = page.getEqualsExample(); + EntityMeta metaExample = getEntityMeta(obj.getClass()); + String conditionClause = metaExample.fieldColumnList.stream() + .filter(fc -> fc.isNotNull(obj)) + .map(fc -> "`%s` = '%s'".formatted(fc.columnName, fc.getAsString(obj))) + .collect(Collectors.joining(" AND ")); + sql.append(conditionClause); + } + if (TimiJava.isNotEmpty(page.getLikeExample())) { + // 模糊查询 + Object obj = page.getLikeExample(); + EntityMeta metaExample = getEntityMeta(obj.getClass()); + String conditionClause = metaExample.fieldColumnList.stream() + .filter(fc -> fc.isNotNull(obj)) + .map(fc -> "`%s` LIKE CONCAT('%%', '%s', '%%')".formatted(fc.columnName, fc.getAsString(obj))) + .collect(Collectors.joining(" AND ")); + sql.append(conditionClause); } return sql.toString(); } @@ -528,6 +547,14 @@ public class SQLProvider { return !isNull(entity); } + public String getAsString(Object obj) { + try { + return field.get(obj).toString(); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + public Field getField() { return field; }