support equals or like Example for page

This commit is contained in:
Timi
2025-12-08 16:56:41 +08:00
parent 7654c3a360
commit 75c8f556a8
5 changed files with 76 additions and 39 deletions

View File

@ -13,12 +13,14 @@ import java.util.LinkedHashMap;
* @author 夜雨
* @version 2023-06-02 14:47
*/
public class Page extends BasePage {
public class Page<T> extends BasePage {
protected T equalsExample;
protected T likeExample;
protected LinkedHashMap<String, BaseMapper.OrderType> orderMap;
protected LinkedHashMap<String, String> likeMap;
public Page() {
}
@ -30,10 +32,26 @@ public class Page extends BasePage {
return (long) index * size;
}
public int getLimit() {
public long getLimit() {
return size;
}
public T getEqualsExample() {
return equalsExample;
}
public void setEqualsExample(T equalsExample) {
this.equalsExample = equalsExample;
}
public T getLikeExample() {
return likeExample;
}
public void setLikeExample(T likeExample) {
this.likeExample = likeExample;
}
public LinkedHashMap<String, BaseMapper.OrderType> getOrderMap() {
return orderMap;
}
@ -46,12 +64,4 @@ public class Page extends BasePage {
orderMap = TimiJava.firstNotNull(orderMap, new LinkedHashMap<>());
orderMap.put(Text.camelCase2underscore(field), orderType);
}
public LinkedHashMap<String, String> getLikeMap() {
return likeMap;
}
public void setLikeMap(LinkedHashMap<String, String> likeMap) {
this.likeMap = likeMap;
}
}

View File

@ -47,7 +47,7 @@ public interface BaseMapper<T, P> {
* @return 数据列表
*/
@SelectProvider(type = SQLProvider.class, method = "listByPage")
List<T> listByPage(Page page);
List<T> listByPage(Page<T> page);
/**
* 根据 Page 对象统计数据量
@ -56,7 +56,7 @@ public interface BaseMapper<T, P> {
* @return 数据量
*/
@SelectProvider(type = SQLProvider.class, method = "countByPage")
long countByPage(Page page);
long countByPage(Page<T> page);
/**
* 分页查询
@ -64,7 +64,7 @@ public interface BaseMapper<T, P> {
* @param page 分页参数
* @return 分页结果
*/
default PageResult<T> page(Page page) {
default PageResult<T> page(Page<T> page) {
PageResult<T> result = new PageResult<>();
result.setTotal(countByPage(page));
result.setList(listByPage(page));

View File

@ -33,7 +33,7 @@ public abstract class AbstractEntityService<T, P> implements BaseService<T, P> {
}
@Override
public PageResult<T> page(Page page) {
public PageResult<T> page(Page<T> page) {
checkMapper();
return baseMapper.page(page);
}

View File

@ -18,5 +18,5 @@ public interface PageableService<T> {
* @param page 页面查询参数
* @return 查询页面结果
*/
PageResult<T> page(Page page);
PageResult<T> page(Page<T> page);
}

View File

@ -50,25 +50,34 @@ public class SQLProvider {
* @param page 分页参数
* @return SQL
*/
public String listByPage(ProviderContext context, @Param("page") Page page) {
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(page.getLikeMap())) {
for (Map.Entry<String, String> item : page.getLikeMap().entrySet()) {
sql.append(" AND `%s` LIKE CONCAT('%%', #{likeMap.%s}, '%%')".formatted(
Text.camelCase2underscore(item.getKey()),
item.getKey()
));
}
if (TimiJava.isNotEmpty(page.getEqualsExample())) {
// 精准查询
Object obj = page.getEqualsExample();
EntityMeta metaExample = getEntityMeta(obj.getClass());
String conditionClause = metaExample.fieldColumnList.stream()
.filter(fc -> fc.isNotNull(obj))
.map(fc -> "`%s` = '%s'".formatted(fc.columnName, fc.getAsString(obj)))
.collect(Collectors.joining(" AND "));
sql.append(conditionClause);
}
// 处理排序
if (TimiJava.isNotEmpty(page.getLikeExample())) {
// 模糊查询
Object obj = page.getLikeExample();
EntityMeta metaExample = getEntityMeta(obj.getClass());
String conditionClause = metaExample.fieldColumnList.stream()
.filter(fc -> fc.isNotNull(obj))
.map(fc -> "`%s` LIKE CONCAT('%%', '%s', '%%')".formatted(fc.columnName, fc.getAsString(obj)))
.collect(Collectors.joining(" AND "));
sql.append(conditionClause);
}
// 排序
if (TimiJava.isNotEmpty(page.getOrderMap())) {
sql.append(" ORDER BY ");
for (Map.Entry<String, BaseMapper.OrderType> item : page.getOrderMap().entrySet()) {
@ -99,22 +108,32 @@ public class SQLProvider {
* @param page 分页参数
* @return SQL
*/
public String countByPage(ProviderContext context, @Param("page") com.imyeyu.spring.bean.Page page) {
public String countByPage(ProviderContext context, @Param("page") 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('%%', #{likeMap.%s}, '%%')".formatted(
Text.camelCase2underscore(item.getKey()),
item.getKey()
));
}
if (TimiJava.isNotEmpty(page.getEqualsExample())) {
// 精准查询
Object obj = page.getEqualsExample();
EntityMeta metaExample = getEntityMeta(obj.getClass());
String conditionClause = metaExample.fieldColumnList.stream()
.filter(fc -> fc.isNotNull(obj))
.map(fc -> "`%s` = '%s'".formatted(fc.columnName, fc.getAsString(obj)))
.collect(Collectors.joining(" AND "));
sql.append(conditionClause);
}
if (TimiJava.isNotEmpty(page.getLikeExample())) {
// 模糊查询
Object obj = page.getLikeExample();
EntityMeta metaExample = getEntityMeta(obj.getClass());
String conditionClause = metaExample.fieldColumnList.stream()
.filter(fc -> fc.isNotNull(obj))
.map(fc -> "`%s` LIKE CONCAT('%%', '%s', '%%')".formatted(fc.columnName, fc.getAsString(obj)))
.collect(Collectors.joining(" AND "));
sql.append(conditionClause);
}
return sql.toString();
}
@ -528,6 +547,14 @@ public class SQLProvider {
return !isNull(entity);
}
public String getAsString(Object obj) {
try {
return field.get(obj).toString();
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public Field getField() {
return field;
}