确认
- [x] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
- [x] 我已经在 issue 中搜索过, 确认问题没有被提出过
- [x] 我已经修改标题, 将标题中的 描述 替换为你的想法(不得删除 描述 前面的部分)
功能改进
我能理解QueryWrapper不允许使用空集合,但是我这么写会出问题 QueryWrapper.in(字段, CollectionUtil.isEmpty(list) ? "" : list); 不能自动切换方法,一直默认Object... value方法类,放外层会使得代码不优雅,出现if else, 版本是3.5.11,问题集合里没看到
参考资料
No response
Comment From: totoro52
CollectionUtil.isEmpty(list) ? "" : list 你这一个返回空字符串一个返回list两种类型了, 三目哪有这么用的
去看一眼in的代码就知道他的接参是Collection接口,另外你in传一个空字符串进去干嘛。。 正确用法应该是
QueryWrapper.in(!CollectionUtil.isEmpty(list), 字段, list);
这才是你要的雅
default Children in(R column, Collection<?> coll) {
return in(true, column, coll);
}
/**
* 字段 IN (value.get(0), value.get(1), ...)
* <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p>
*
* <li> 注意!集合为空若存在逻辑错误,请在 condition 条件中判断 </li>
* <li> 如果集合为 empty 则不会进行 sql 拼接 </li>
*
* @param condition 执行条件
* @param column 字段
* @param coll 数据集合
* @return children
*/
Children in(boolean condition, R column, Collection<?> coll);
Comment From: FeiLongTang
兄弟,这得看项目场景的,有没有一种可能空字段也是要用到的,举个例子,我先用明细表的名称模糊查询,拿到所有主表id,然后用in去查主表,可能存在明细表数据不存在的情况,如果用你的方式,那就失去了意义。你还得再嵌套一层else,
Comment From: FeiLongTang
否则你猜我为啥还要传空字符串,且难道就不能传不同参数返回相同结果吗。每一种问题或者优化都有他诞生的背景,我只是提供这种场景的来源
Comment From: totoro52
第一,java是强类型,一个三目返回两种类型并且不是继承关系的,这种场景不该在面向对象语言里出现,不信你自己写一个,看看接收变量是不是变成了Object,你永远不知道这个Object是啥类型,必须手动推断。 第二,明细表查出来的id如果是空表,你还是去执行查主表,岂不是整个表全查出来了?那这个in方法的意义是啥,直接执行list方法不就行。 你这种直接自己封装一个inOrList不就行
Comment From: FeiLongTang
1、针对你的第一点,我昨天写的时候确实发现变成了Object,所以我才有发帖者此问,其次,我感觉这块是可以方法重载的,是List参数直接调用Collection参数方法,否则就Object方法 2、如果是按我这种写,有重载方法,是空的,我传个空字符串,会查不到的。有封装inOrList,但这种不就跟mybatis里写SQL,test条件写两遍罢了,但我用上了plus,我肯定是想图省事的
Comment From: totoro52
接收参是Object,那面向对象将毫无意义,没有人知道你的Object永远会是个什么,你必须对所有已知类型做一个推断。 就和前端传参用Map一个道理,你永远不知道Map里有什么。 这不是优雅。这是遮羞布。
Comment From: FeiLongTang
但我的想法是,里面如果写了Collection集合类方法,也写了Object类方法,那么应该需要识别一下集合类,否则不如直接删了集合类,直接用Object类不就行了?反正集合也是个Object