diff --git a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java index 6fe43b3..b9aabf9 100644 --- a/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java +++ b/src/main/java/com/imyeyu/spring/mapper/BaseMapper.java @@ -162,4 +162,12 @@ public interface BaseMapper { */ @DeleteProvider(type = SQLProvider.class, method = "destroy") void destroy(P id); + + /** + * 根据示例批量销毁(物理删除) + * + * @param t 示例对象 + */ + @UpdateProvider(type = SQLProvider.class, method = "destroyAllByExample") + void destroyAllByExample(T t); } diff --git a/src/main/java/com/imyeyu/spring/mapper/DynamicTableMapper.java b/src/main/java/com/imyeyu/spring/mapper/DynamicTableMapper.java index cb2300d..af7d216 100644 --- a/src/main/java/com/imyeyu/spring/mapper/DynamicTableMapper.java +++ b/src/main/java/com/imyeyu/spring/mapper/DynamicTableMapper.java @@ -150,4 +150,13 @@ public interface DynamicTableMapper { */ @DeleteProvider(type = DynamicTableSQLProvider.class, method = "destroy") void destroy(@Param("tableName") String tableName, @Param("id") P id); + + /** + * 根据示例批量销毁(物理删除) + * + * @param tableName 表名 + * @param entity 示例对象 + */ + @UpdateProvider(type = DynamicTableSQLProvider.class, method = "destroyAllByExample") + void destroyAllByExample(@Param("tableName") String tableName, @Param("entity") T entity); } diff --git a/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java b/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java index 2a51018..799f879 100644 --- a/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java +++ b/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java @@ -414,6 +414,25 @@ public abstract class BaseSQLProvider { return "DELETE FROM `%s` WHERE `%s` = #{%s}".formatted(tableName, meta.idFieldColumn.columnName, idParam); } + /** + * 构建批量逻辑删除 SQL + * + * @param meta 实体元数据 + * @param tableName 表名 + * @param entity 示例实体 + * @param paramPrefix 参数前缀(如 "entity."),空字符串表示无前缀 + * @return SQL + */ + protected String buildDestroyAllByExampleSQL(EntityMeta meta, String tableName, Object entity, String paramPrefix) { + TimiException.required(meta.canDestroy, "not allow destroy for %s".formatted(meta.entityClass)); + String destroyClause = meta.fieldColumnList.stream() + .filter(FieldColumn::isNotId) + .filter(fc -> fc.isNotEmpty(entity)) + .map(fc -> "`%s` = #{%s%s}".formatted(fc.columnName, paramPrefix, fc.fieldName)) + .collect(Collectors.joining(" AND ")); + return "DELETE FROM `%s` WHERE %s".formatted(tableName, destroyClause); + } + /** * 实体元数据 * diff --git a/src/main/java/com/imyeyu/spring/util/DynamicTableSQLProvider.java b/src/main/java/com/imyeyu/spring/util/DynamicTableSQLProvider.java index e86648c..738a62c 100644 --- a/src/main/java/com/imyeyu/spring/util/DynamicTableSQLProvider.java +++ b/src/main/java/com/imyeyu/spring/util/DynamicTableSQLProvider.java @@ -172,4 +172,17 @@ public class DynamicTableSQLProvider extends BaseSQLProvider { EntityMeta meta = getEntityMeta(context); return buildDestroySQL(meta, tableName, "id"); } + + /** + * 根据示例批量逻辑删除 + * + * @param context 代理器上下文 + * @param tableName 表名 + * @param entity 实体 + * @return SQL + */ + public String destroyAllByExample(ProviderContext context, @Param("tableName") String tableName, @Param("entity") Object entity) { + EntityMeta meta = getEntityMeta(context); + return buildDestroyAllByExampleSQL(meta, tableName, entity, "entity."); + } } diff --git a/src/main/java/com/imyeyu/spring/util/RawSQLProvider.java b/src/main/java/com/imyeyu/spring/util/RawSQLProvider.java index 75b7e0d..3e48a45 100644 --- a/src/main/java/com/imyeyu/spring/util/RawSQLProvider.java +++ b/src/main/java/com/imyeyu/spring/util/RawSQLProvider.java @@ -41,9 +41,4 @@ public class RawSQLProvider extends SQLProvider { .collect(Collectors.joining(" AND ")); return "SELECT %s FROM `%s` WHERE %s".formatted(meta.selectAllClause, meta.table, conditionClause); } - - @Override - public String deleteAllByExample(Object entity) { - return super.deleteAllByExample(entity); - } } diff --git a/src/main/java/com/imyeyu/spring/util/SQLProvider.java b/src/main/java/com/imyeyu/spring/util/SQLProvider.java index ad910c5..3b51666 100644 --- a/src/main/java/com/imyeyu/spring/util/SQLProvider.java +++ b/src/main/java/com/imyeyu/spring/util/SQLProvider.java @@ -162,4 +162,15 @@ public class SQLProvider extends BaseSQLProvider { EntityMeta meta = getEntityMeta(context); return buildDestroySQL(meta, meta.table, "id"); } + + /** + * 根据示例批量销毁(物理删除) + * + * @param entity 实体 + * @return SQL + */ + public String destroyAllByExample(Object entity) { + EntityMeta meta = getEntityMeta(entity.getClass()); + return buildDestroyAllByExampleSQL(meta, meta.table, entity, ""); + } }