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 数据量
|
* @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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user