当前使用版本(必填,否则不予处理)
3.3.0
该问题是如何引起的?(确定最新版也有问题再提!!!)
重现步骤(如果有就写完整)
在ServiceImpl子类中自定义一个更新操作,例如:
public boolean updateBy(SFunction<T, ?> column, Object columnValue, @NonNull T entity, boolean setNull) {
UpdateWrapper<T> updateWrapper = Wrappers.update();
if (setNull) {
((Map<String, Object>) BeanMap.create(entity))
.forEach((name, value) -> updateWrapper.set(CommonUtils.lowerUnderscore(name), value));
} else {
((Map<String, Object>) BeanMap.create(entity)).entrySet().stream()
.filter(entry -> null != entry.getValue())
.forEach(entry -> updateWrapper.set(CommonUtils.lowerUnderscore(entry.getKey()), entry.getValue()));
}
return update(updateWrapper.lambda().eq(column, columnValue));
}
调用该方法更新entity,生成的sql语句,逻辑删除字段会在自定义删除的字段(deleted)之前出现,例如:
[DEBUG][2020-07-03T20:18:39.093+0800][http-nio-8345-exec-4:BaseJdbcLogger.java:143] ==> Preparing: UPDATE teacher_profile SET deleted=?,teacher_id=?,gender=?,name=?,telephone=?,avatar=?,id=?,status=? WHERE deleted=0 AND (teacher_id = ?)
[DEBUG][2020-07-03T20:18:39.093+0800][http-nio-8345-exec-4:Slf4jLogger.java:32] registerSynchronization ( com.atomikos.jdbc.AtomikosConnectionProxy$JdbcRequeueSynchronization@4b1c0b43 ) for transaction 172.17.33.194.tm159377871895300003
[DEBUG][2020-07-03T20:18:39.093+0800][http-nio-8345-exec-4:Slf4jLogger.java:32] atomikos connection proxy for com.mysql.cj.jdbc.ConnectionWrapper@1ffd2c0d: calling prepareStatement(UPDATE teacher_profile SET deleted=?,teacher_id=?,gender=?,name=?,telephone=?,avatar=?,id=?,status=?
WHERE deleted=0
AND (teacher_id = ?))...
[DEBUG][2020-07-03T20:18:39.096+0800][http-nio-8345-exec-4:BaseJdbcLogger.java:143] ==> Parameters: 0(Integer), 3(Integer), 0(Integer), 测试老师(String), 15828000000(String), xxx(String), 0(Integer), 0(Integer), 3(Integer)
[DEBUG][2020-07-03T20:18:39.097+0800][http-nio-8345-exec-4:BaseJdbcLogger.java:143] <== Updates: 1
是否有方法可以设置逻辑删除字段的位置?在调用updateById等方法的时候逻辑删除字段是会填充到条件语句的最后,个人觉得放在最后才是合理的
报错信息
Comment From: nieqiurong
难道你以为数据库执行引擎会傻到先按deleted找完之后再按你的索引列去找?????
Comment From: yxzuestc
难道你以为数据库执行引擎会傻到先按deleted找完之后再按你的索引列去找?????
所以不是应该
UPDATE teacher_profile SET deleted=?,teacher_id=?,gender=?,name=?,telephone=?,avatar=?,id=?,status=? WHERE teacher_id = ? AND deleted=0
比
UPDATE teacher_profile SET deleted=?,teacher_id=?,gender=?,name=?,telephone=?,avatar=?,id=?,status=? WHERE deleted=0 AND (teacher_id = ?)
更合理吗? 为什么mybatis plus生成了后者?
Comment From: nieqiurong
难道你以为数据库执行引擎会傻到先按deleted找完之后再按你的索引列去找?????
所以不是应该
UPDATE teacher_profile SET deleted=?,teacher_id=?,gender=?,name=?,telephone=?,avatar=?,id=?,status=? WHERE teacher_id = ? AND deleted=0比
UPDATE teacher_profile SET deleted=?,teacher_id=?,gender=?,name=?,telephone=?,avatar=?,id=?,status=? WHERE deleted=0 AND (teacher_id = ?)更合理吗? 为什么mybatis plus生成了后者?
这只是sql显示上的问题,达不到你所认为的索引失效,假设这里按照认为的,导致索引失效了,那么,是不是还要提供一个注解来给你标记索引字段,生成where后面的条件sql时,要优先给你把你的索引字段全放前面才不会导致索引失效。