support list() and count() in SQLProvider, fix custom column mapper
This commit is contained in:
@ -43,6 +43,7 @@ public interface BaseMapper<T, P> {
|
||||
*
|
||||
* @return 数据量
|
||||
*/
|
||||
@SelectProvider(type = SQLProvider.class, method = "count")
|
||||
long count();
|
||||
|
||||
/**
|
||||
@ -52,6 +53,7 @@ public interface BaseMapper<T, P> {
|
||||
* @param limit 数据量
|
||||
* @return 数据列表
|
||||
*/
|
||||
@SelectProvider(type = SQLProvider.class, method = "list")
|
||||
List<T> list(long offset, int limit);
|
||||
|
||||
/**
|
||||
|
||||
@ -40,6 +40,26 @@ public class SQLProvider {
|
||||
/** 反射缓存 */
|
||||
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>
|
||||
@ -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<Field> allFieldList = Ref.listAllFields(entityClass);
|
||||
|
||||
StringBuilder selectAllClause = new StringBuilder();
|
||||
FieldColumn idFieldColumn = null;
|
||||
List<FieldColumn> 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);
|
||||
|
||||
Reference in New Issue
Block a user