当前使用版本(必填,否则不予处理)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
该问题是如何引起的?(确定最新版也有问题再提!!!)
实现逻辑删除注解@TableLogic,生产环境想记录删除时间,删除人信息。注解@TableField(fill = FieldFill.UPDATE)没有效果,我开始以为逻辑删除也是做的修改,但是实际MetaObjectHandler里面没进来。 搜索了Issues里,也看见了差不多的提问,其中有解答用BaseMapper中的: https://github.com/baomidou/mybatis-plus/issues/3754
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> queryWrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
但是我试用的 IService 中的removeByIds方法 default boolean removeByIds(Collection<? extends Serializable> idList) { return CollectionUtils.isEmpty(idList) ? false : SqlHelper.retBool(this.getBaseMapper().deleteBatchIds(idList)); } 实际也是用的deleteBatchIds方法。
重现步骤(如果有就写完整)
报错信息
Comment From: miemieYaho
最新版用 deleteById(your entity)
Comment From: reixuemin
最新版用 deleteById(your entity)
那批量删除呢?
Comment From: syherry
插个眼,有没有大佬解决的,这个东西很困扰哦,总不能每次remove之前都去update一下吧
Comment From: For-Every
我认为逻辑删除的目的就是为了保留数据的变化,如果不走自动填充更新时间与人员信息,那岂不是最后一次的变化看不见了? 希望作者能尽快改善或者给我们一个方案实现,谢谢
Comment From: aptexd
现在的逻辑是只有更具主键删除,和更新修改时间,想修改更新人似乎还是不可以,希望可以有这个功能
Comment From: nieqiurong
4179
Comment From: hocgin
4179
@nieqiurong
这个调整是完善逻辑删除触发 fill 功能,但是目前在 MetaObjectHandler 还是无法区分出是逻辑删除触发的 fill 还是普通更新触发的 fill
Comment From: nieqiurong
4179
@nieqiurong
这个调整是完善逻辑删除触发 fill 功能,但是目前在 MetaObjectHandler 还是无法区分出是逻辑删除触发的 fill 还是普通更新触发的 fill
逻辑删除因为是update操作,所以在mybatis层面是无法根据SqlCommandType来区分是普通更新还是逻辑删除的,如果需要记录删除人这种字段,只能自行扩展处理了,两个不合理的方案,改变逻辑删除注入的MappedStatement为SqlCommandType,等同于在xml的
Comment From: sea158246forset
这个看了相关的源码SqlCommandType无法区分逻辑删除,在执行填充的时候是根据SqlCommandType的值来进行相关填充的调用都调用的是update填充
Comment From: qmdx
4179
@nieqiurong 这个调整是完善逻辑删除触发 fill 功能,但是目前在 MetaObjectHandler 还是无法区分出是逻辑删除触发的 fill 还是普通更新触发的 fill
逻辑删除因为是update操作,所以在mybatis层面是无法根据SqlCommandType来区分是普通更新还是逻辑删除的,如果需要记录删除人这种字段,只能自行扩展处理了,两个不合理的方案,改变逻辑删除注入的MappedStatement为SqlCommandType,等同于在xml的里面写update的更新语句,第二种就是根据MappedStatement的id来单独处理填充逻辑。 其次,看自身业务情况把,是否需要单独记录删除人这样,执行删除操作了,最后的更新人和更新时间也等于最终删除人和删除时间了。
当前逻辑删除 service 层做了部分填充回写支持,更多个性需求请自己实现
Comment From: xcore-fun
我看了一下MybatisParameterHandler,我觉得加一个解析就可以判断是否逻辑删除
try {
var deletedField = tableInfo.getLogicDeleteFieldInfo().getColumn();
var statement = (Update) CCJSqlParserUtil.parse(boundSql.getSql());
var sets = statement.getUpdateSets();
var logicDelete = sets.stream().anyMatch(m -> m.getColumns().stream().anyMatch(c -> c.getColumnName().equalsIgnoreCase(deletedField)));
if (!logicDelete) {
updateFill(metaObject, tableInfo);
} else {
removeFill(metaObject, tableInfo);
}
} catch (JSQLParserException e) {
throw new RuntimeException(e);
}