最后那个likeRight应该在nested方法外面,不是里面吧。
使用and,他默认会给你加and关键字,但是如果and出现在第一位,会给你去掉where后的and,感觉跟nested没啥区别,nested的官方解释是“正常嵌套 不带 AND 或者 OR”
那你看看能不能自己写代码,判断出是否有风险,有风险不允许执行即可。如果无法判断出是否有风险,建议不要这么干。
需求七是:(age<40 or email is not null) and name like '王%'
你想实现的效果是name like '王%' and (age<40 or email is not null) 吗?没太明白你的意思。
可以采取楼上的用法,例如:Wrappers.<User>query().select("distinct name,age,sex");
这个就是个参数名,随便起的名字,建议你看看lambda表达式,你就能理解了。
官方文档上解释nested是正常嵌套 不带 AND 或者 OR。但是我试验了一下,感觉跟用and的效果是一样的呢。
找到原因了就好,没帮上你什么忙。
是的,Mybatis-Plus对这块进行了智能处理,如果and是第一句,则不会在生成的where语句后直接加and的,以此来保证sql语句语法的正确性。
该函数式接口声明了T、R两个泛型形式参数,在and中,实际传入的你可以理解为Function接口的匿名实现类,这时候的泛型是实参,T和R都是QueryWrapper。而且and中你要追溯源码,最后确实调用apply了,我给你列出最后调用apply的代码,在AbstractWrapper类中:
protected Children addNestedCondition(boolean condition, Function<Children, Children> func) {
return doIt(condition, LEFT_BRACKET, func.apply(instance()), RIGHT_BRACKET);
}
你也可以运行时debug一下,根据方法调用栈追踪一下。
左边应该叫实现的方法的参数名,是形式参数