diff --git a/src/main/java/com/imyeyu/spring/annotation/table/PageIgnore.java b/src/main/java/com/imyeyu/spring/annotation/table/PageIgnore.java
new file mode 100644
index 0000000..8e55a44
--- /dev/null
+++ b/src/main/java/com/imyeyu/spring/annotation/table/PageIgnore.java
@@ -0,0 +1,21 @@
+package com.imyeyu.spring.annotation.table;
+
+import com.imyeyu.spring.bean.Page;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 在 {@link com.imyeyu.spring.mapper.BaseMapper#page(Page)} 方法忽略查询该属性
+ *
+ * {@link com.imyeyu.spring.service.AbstractEntityService#page(Page)} 同上
+ *
+ * @author 夜雨
+ * @since 2025-12-12 14:54
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface PageIgnore {
+}
diff --git a/src/main/java/com/imyeyu/spring/util/SQLProvider.java b/src/main/java/com/imyeyu/spring/util/SQLProvider.java
index ddbf5de..ef98522 100644
--- a/src/main/java/com/imyeyu/spring/util/SQLProvider.java
+++ b/src/main/java/com/imyeyu/spring/util/SQLProvider.java
@@ -1,6 +1,7 @@
package com.imyeyu.spring.util;
import com.imyeyu.java.TimiJava;
+import com.imyeyu.java.bean.CallbackArgReturn;
import com.imyeyu.java.bean.timi.TimiCode;
import com.imyeyu.java.bean.timi.TimiException;
import com.imyeyu.java.ref.Ref;
@@ -8,6 +9,7 @@ import com.imyeyu.spring.annotation.table.AutoUUID;
import com.imyeyu.spring.annotation.table.Column;
import com.imyeyu.spring.annotation.table.DeleteColumn;
import com.imyeyu.spring.annotation.table.Id;
+import com.imyeyu.spring.annotation.table.PageIgnore;
import com.imyeyu.spring.annotation.table.Table;
import com.imyeyu.spring.annotation.table.Transient;
import com.imyeyu.spring.bean.Page;
@@ -53,7 +55,7 @@ public class SQLProvider {
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));
+ sql.append("SELECT %s FROM `%s` WHERE 1 = 1".formatted(meta.selectPageClause, meta.table));
if (meta.canDelete) {
sql.append(" AND (`deleted_at` IS NULL OR %s < `deleted_at`)".formatted(Time.now()));
}
@@ -367,6 +369,9 @@ public class SQLProvider {
/** 查询字段映射 */
final String selectAllClause;
+ /** 页面查询字段映射 */
+ final String selectPageClause;
+
/** ID 字段 */
final FieldColumn idFieldColumn;
@@ -400,8 +405,6 @@ public class SQLProvider {
TimiException.required(this.table, String.format("empty table annotation value for %s entity", entityClass.getName()));
}
List allFieldList = Ref.listAllFields(entityClass);
-
- StringBuilder selectAllClause = new StringBuilder();
FieldColumn idFieldColumn = null;
List fieldColumnList = new ArrayList<>();
for (int i = 0; i < allFieldList.size(); i++) {
@@ -414,21 +417,10 @@ public class SQLProvider {
TimiException.requiredNull(idFieldColumn, String.format("multi id field for %s entity", entityClass.getName()));
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);
}
- this.selectAllClause = selectAllClause.substring(0, selectAllClause.length() - 1);
+ this.selectAllClause = buildSelectClause(fieldColumnList, null);
+ this.selectPageClause = buildSelectClause(fieldColumnList, fc -> !fc.getField().isAnnotationPresent(PageIgnore.class));
this.idFieldColumn = idFieldColumn;
this.fieldColumnList = List.of(fieldColumnList.toArray(new FieldColumn[0])); // 转为只读
canCreate = Creatable.class.isAssignableFrom(entityClass);
@@ -437,6 +429,28 @@ public class SQLProvider {
canDestroy = Destroyable.class.isAssignableFrom(entityClass);
}
+ private String buildSelectClause(List fieldColumnList, CallbackArgReturn callback) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < fieldColumnList.size(); i++) {
+ FieldColumn fieldColumn = fieldColumnList.get(i);
+ Field field = fieldColumn.getField();
+ if (callback != null && !callback.handler(fieldColumn)) {
+ continue;
+ }
+ Column column = field.getAnnotation(Column.class);
+ if (column == null) {
+ sb.append('`').append(fieldColumn.columnName).append('`');
+ sb.append(',');
+ } else {
+ // 自定义映射列名
+ sb.append('`').append(column.value()).append('`');
+ sb.append(" AS `").append(fieldColumn.fieldName).append('`');
+ sb.append(',');
+ }
+ }
+ return sb.substring(0, sb.length() - 1);
+ }
+
public Class> getEntityClass() {
return entityClass;
}