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

@ -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;
}