update BaseMapper.page

This commit is contained in:
Timi
2025-12-03 10:40:50 +08:00
parent 745b3acfef
commit 7aadec7306
4 changed files with 97 additions and 41 deletions

View File

@@ -10,6 +10,7 @@ import com.imyeyu.spring.annotation.table.DeleteColumn;
import com.imyeyu.spring.annotation.table.Id;
import com.imyeyu.spring.annotation.table.Table;
import com.imyeyu.spring.annotation.table.Transient;
import com.imyeyu.spring.bean.Page;
import com.imyeyu.spring.entity.Creatable;
import com.imyeyu.spring.entity.Deletable;
import com.imyeyu.spring.entity.Destroyable;
@@ -42,39 +43,80 @@ 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 listOrder(ProviderContext context, @Param("offset") Long offset, @Param("limit") Integer limit, @Param("orderMap") Map<String, BaseMapper.OrderType> orderMap) {
/**
* 根据 Page 对象查询数据列表
*
* @param context 代理器上下文
* @param page 分页参数
* @return SQL
*/
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(orderMap)) {
// 处理模糊查询
if (TimiJava.isNotEmpty(page.getLikeMap())) {
for (Map.Entry<String, String> item : page.getLikeMap().entrySet()) {
sql.append(" AND `%s` LIKE CONCAT('%%', #{page.likeMap.%s}, '%%')".formatted(
Text.camelCase2underscore(item.getKey()),
item.getKey()
));
}
}
// 处理排序
if (TimiJava.isNotEmpty(page.getOrderMap())) {
sql.append(" ORDER BY ");
for (Map.Entry<String, BaseMapper.OrderType> item : orderMap.entrySet()) {
sql.append(Text.camelCase2underscore(item.getKey())).append(' ').append(item.getValue().toString());
sql.append(", ");
for (Map.Entry<String, BaseMapper.OrderType> item : page.getOrderMap().entrySet()) {
sql.append("`%s` %s, ".formatted(
Text.camelCase2underscore(item.getKey()),
item.getValue().toString()
));
}
sql.deleteCharAt(sql.length() - 2);
} else {
// 默认排序
if (meta.canCreate && !meta.canUpdate) {
sql.append(" ORDER BY created_at DESC");
sql.append(" ORDER BY `created_at` DESC");
}
if (meta.canCreate && meta.canUpdate) {
sql.append(" ORDER BY COALESCE(updated_at, created_at) DESC");
sql.append(" ORDER BY COALESCE(`updated_at`, `created_at`) DESC");
}
}
return sql.append(" LIMIT %s, %s".formatted(offset, limit)).toString();
// 分页
sql.append(" LIMIT #{page.offset}, #{page.limit}");
return sql.toString();
}
/**
* 根据 Page 对象统计数据量
*
* @param context 代理器上下文
* @param page 分页参数
* @return SQL
*/
public String countByPage(ProviderContext context, @Param("page") com.imyeyu.spring.bean.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<String, String> item : page.getLikeMap().entrySet()) {
sql.append(" AND `%s` LIKE CONCAT('%%', #{page.likeMap.%s}, '%%')".formatted(
Text.camelCase2underscore(item.getKey()),
item.getKey()
));
}
}
return sql.toString();
}
public String listAll(ProviderContext context) {