support list() and count() in SQLProvider, fix custom column mapper

This commit is contained in:
Timi
2025-07-25 10:50:33 +08:00
parent 39f628e71a
commit 831d36e095
2 changed files with 41 additions and 2 deletions

View File

@ -43,6 +43,7 @@ public interface BaseMapper<T, P> {
* *
* @return 数据量 * @return 数据量
*/ */
@SelectProvider(type = SQLProvider.class, method = "count")
long count(); long count();
/** /**
@ -52,6 +53,7 @@ public interface BaseMapper<T, P> {
* @param limit 数据量 * @param limit 数据量
* @return 数据列表 * @return 数据列表
*/ */
@SelectProvider(type = SQLProvider.class, method = "list")
List<T> list(long offset, int limit); List<T> list(long offset, int limit);
/** /**

View File

@ -40,6 +40,26 @@ public class SQLProvider {
/** 反射缓存 */ /** 反射缓存 */
private static final Map<Class<?>, EntityMeta> ENTITY_META_CACHE = new ConcurrentHashMap<>(); private static final Map<Class<?>, 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();
}
/** /**
* 插入 * 插入
* <p><i>不实现 {@link Creatable} 也允许调用是合理的,某些数据属于关联数据,不参与主创建过程</i></p> * <p><i>不实现 {@link Creatable} 也允许调用是合理的,某些数据属于关联数据,不参与主创建过程</i></p>
@ -82,7 +102,7 @@ public class SQLProvider {
TimiException.required(meta.idFieldColumn, "not found id field in %s".formatted(meta.entityClass)); TimiException.required(meta.idFieldColumn, "not found id field in %s".formatted(meta.entityClass));
StringBuilder sql = new StringBuilder(); 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) { if (meta.canDelete) {
sql.append(" AND (`deleted_at` IS NULL OR %s < `deleted_at`)".formatted(Time.now())); 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 ")); .collect(Collectors.joining(" AND "));
StringBuilder sql = new StringBuilder(); 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 (meta.canDelete) {
if (TimiJava.isNotEmpty(conditionClause)) { if (TimiJava.isNotEmpty(conditionClause)) {
sql.append(" AND "); sql.append(" AND ");
@ -221,6 +241,9 @@ public class SQLProvider {
/** 表名 */ /** 表名 */
final String table; final String table;
/** 查询字段映射 */
final String selectAllClause;
/** ID 字段 */ /** ID 字段 */
final FieldColumn idFieldColumn; final FieldColumn idFieldColumn;
@ -252,6 +275,7 @@ public class SQLProvider {
} }
List<Field> allFieldList = Ref.listAllFields(entityClass); List<Field> allFieldList = Ref.listAllFields(entityClass);
StringBuilder selectAllClause = new StringBuilder();
FieldColumn idFieldColumn = null; FieldColumn idFieldColumn = null;
List<FieldColumn> fieldColumnList = new ArrayList<>(); List<FieldColumn> fieldColumnList = new ArrayList<>();
for (int i = 0; i < allFieldList.size(); i++) { 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())); TimiException.requiredNull(idFieldColumn, String.format("multi id field for %s entity", entityClass.getName()));
idFieldColumn = fieldColumn; 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); fieldColumnList.add(fieldColumn);
} }
this.selectAllClause = selectAllClause.substring(0, selectAllClause.length() - 1);
this.idFieldColumn = idFieldColumn; this.idFieldColumn = idFieldColumn;
this.fieldColumnList = List.of(fieldColumnList.toArray(new FieldColumn[0])); // 转为只读 this.fieldColumnList = List.of(fieldColumnList.toArray(new FieldColumn[0])); // 转为只读
canUpdate = Updatable.class.isAssignableFrom(entityClass); canUpdate = Updatable.class.isAssignableFrom(entityClass);