From 831d36e095b5b855235f2a0ebef329db7869fce8 Mon Sep 17 00:00:00 2001 From: Timi Date: Fri, 25 Jul 2025 10:50:33 +0800 Subject: [PATCH] support list() and count() in SQLProvider, fix custom column mapper --- .../com/imyeyu/spring/mapper/BaseMapper.java | 2 + .../com/imyeyu/spring/util/SQLProvider.java | 41 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java index 73b5876..0488a01 100644 --- a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java +++ b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java @@ -43,6 +43,7 @@ public interface BaseMapper { * * @return 数据量 */ + @SelectProvider(type = SQLProvider.class, method = "count") long count(); /** @@ -52,6 +53,7 @@ public interface BaseMapper { * @param limit 数据量 * @return 数据列表 */ + @SelectProvider(type = SQLProvider.class, method = "list") List list(long offset, int limit); /** diff --git a/src/main/java/com/imyeyu/spring/util/SQLProvider.java b/src/main/java/com/imyeyu/spring/util/SQLProvider.java index cadb41c..aa8b7ce 100644 --- a/src/main/java/com/imyeyu/spring/util/SQLProvider.java +++ b/src/main/java/com/imyeyu/spring/util/SQLProvider.java @@ -40,6 +40,26 @@ public class SQLProvider { /** 反射缓存 */ private static final Map, EntityMeta> ENTITY_META_CACHE = new ConcurrentHashMap<>(); + public String count(ProviderContext context) { + 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())); + } + return sql.toString(); + } + + public String list(ProviderContext context, @Param("offset") Long offset, @Param("limit") Integer limit) { + 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())); + } + return sql.append(" LIMIT #{offset}, #{limit}").toString(); + } + /** * 插入 *

不实现 {@link Creatable} 也允许调用是合理的,某些数据属于关联数据,不参与主创建过程

@@ -82,7 +102,7 @@ public class SQLProvider { TimiException.required(meta.idFieldColumn, "not found id field in %s".formatted(meta.entityClass)); StringBuilder sql = new StringBuilder(); - sql.append("SELECT * FROM `%s` WHERE `%s` = #{%s}".formatted(meta.table, meta.idFieldColumn.columnName, id)); + sql.append("SELECT %s FROM `%s` WHERE `%s` = #{%s}".formatted(meta.selectAllClause, meta.table, meta.idFieldColumn.columnName, id)); if (meta.canDelete) { sql.append(" AND (`deleted_at` IS NULL OR %s < `deleted_at`)".formatted(Time.now())); } @@ -121,7 +141,7 @@ public class SQLProvider { .collect(Collectors.joining(" AND ")); StringBuilder sql = new StringBuilder(); - sql.append("SELECT * FROM `%s` WHERE %s".formatted(meta.table, conditionClause)); + sql.append("SELECT %s FROM `%s` WHERE %s".formatted(meta.selectAllClause, meta.table, conditionClause)); if (meta.canDelete) { if (TimiJava.isNotEmpty(conditionClause)) { sql.append(" AND "); @@ -221,6 +241,9 @@ public class SQLProvider { /** 表名 */ final String table; + /** 查询字段映射 */ + final String selectAllClause; + /** ID 字段 */ final FieldColumn idFieldColumn; @@ -252,6 +275,7 @@ public class SQLProvider { } List allFieldList = Ref.listAllFields(entityClass); + StringBuilder selectAllClause = new StringBuilder(); FieldColumn idFieldColumn = null; List fieldColumnList = new ArrayList<>(); for (int i = 0; i < allFieldList.size(); i++) { @@ -264,8 +288,21 @@ public class SQLProvider { TimiException.requiredNull(idFieldColumn, String.format("multi id field for %s entity", entityClass.getName())); idFieldColumn = fieldColumn; } + { + Column column = field.getAnnotation(Column.class); + if (column == null) { + selectAllClause.append('`').append(fieldColumn.columnName).append('`'); + selectAllClause.append(','); + } else { + // 处理自定义映射列名 + selectAllClause.append('`').append(column.value()).append('`'); + selectAllClause.append(" AS `").append(fieldColumn.fieldName).append('`'); + selectAllClause.append(','); + } + } fieldColumnList.add(fieldColumn); } + this.selectAllClause = selectAllClause.substring(0, selectAllClause.length() - 1); this.idFieldColumn = idFieldColumn; this.fieldColumnList = List.of(fieldColumnList.toArray(new FieldColumn[0])); // 转为只读 canUpdate = Updatable.class.isAssignableFrom(entityClass);