update BaseMapper.page
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user