当前使用版本(必填,否则不予处理)

3.4.3.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

根据id批量更新,ServiceImpl.updateBatchById(Collection entityList) 实体T中如果没有传id,该方法返回结果更新成功,但实际上数据库数据并没有被更新

重现步骤(如果有就写完整)

直接调用ServiceImpl.updateBatchById(Collection entityList)即可复现

报错信息

无报错,返回结果与实际结果不符

Comment From: 986510453

你都没有传ID,肯定就没有更新啊,没传ID却更新了才有问题吧

Comment From: hongye142857

你都没有传ID,肯定就没有更新啊,没传ID却更新了才有问题吧

我的问题是,没有更新成功应该返回更新失败,而不是返回更新成功

Comment From: 986510453

不,对于功能本身来说是执行成功的,就像你写一条sql,update set id = -1, 没有更新数据,要返回执行失败吗?不是,是返回执行成功,只不过修改行数为0罢了,但这不是程序的问题,是用户参数的问题。所以如果要报错,也需要用户在执行前做参数校验然后报错

Comment From: hongye142857

不,对于功能本身来说是执行成功的,就像你写一条sql,update set id = -1, 没有更新数据,要返回执行失败吗?不是,是返回执行成功,只不过修改行数为0罢了,但这不是程序的问题,是用户参数的问题。所以如果要报错,也需要用户在执行前做参数校验然后报错

但是用updateById就没有这个问题,更新行数为0就是返回更新失败

Comment From: 986510453

目前batch操作是只要执行成功就会返回true, batch不好根据修改行数来确定返回值,比如batch两条,一条修改一行数据,一条修改0行数据,那应该返回true还是false呢?

Comment From: hongye142857

目前batch操作是只要执行成功就会返回true, batch不好根据修改行数来确定返回值,比如batch两条,一条修改一行数据,一条修改0行数据,那应该返回true还是false呢?

我理解既然是批量操作,肯定是以一个批量作为整体看,大部分情况都有事务性,如果不关注整体成功可以不关注返回值,大部分情况都是关注是否整体更新成功,需要的返回这个批次是否整体更新成功,我个人的看法是这样的,你们可以考虑一下这个返回值是不是以整体更新成功与否来判断

Comment From: 986510453

但是作为一个开源框架,必须考虑各方面需求,尽量通用,所以我们把控制权交给了用户,由用户根据自身需求来自行判断。

Comment From: hongye142857

但是作为一个开源框架,必须考虑各方面需求,尽量通用,所以我们把控制权交给了用户,由用户根据自身需求来自行判断。

而且按照现在的设计是不是批量更新永远都是返回成功,如果语句执行失败,也不存在返回值了,直接抛异常了,现在我的案例就是更新了0行全部失败,也是返回了true,我理解现在这个方法不抛异常永远都是执行成功,那这个返回值好像也没有意义了

Comment From: 986510453

是的,目前是这么设计的,为了适配不同DB做了很多取舍,欢迎PR😉

Comment From: hongye142857

是的,目前是这么设计的,为了适配不同DB做了很多取舍,欢迎PR😉

哈哈 不敢不敢 只是从大部分场景上理解批量更新需要一个能知道是否整体更新成功,对不同db兼容性不是很熟悉

Comment From: 986510453

没事呀,欢迎PR的,大大小小的都可以

Comment From: SaulJWu

目前batch操作是只要执行成功就会返回true, batch不好根据修改行数来确定返回值,比如batch两条,一条修改一行数据,一条修改0行数据,那应该返回true还是false呢?

我理解既然是批量操作,肯定是以一个批量作为整体看,大部分情况都有事务性,如果不关注整体成功可以不关注返回值,大部分情况都是关注是否整体更新成功,需要的返回这个批次是否整体更新成功,我个人的看法是这样的,你们可以考虑一下这个返回值是不是以整体更新成功与否来判断

我也遇到这个问题了,不知道3.5.0版本是否修复。