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

3.30,3.31

该问题是怎么引起的?(最新版上已修复的会直接close掉)

重现步骤

/* * SELECT id,name,age,email,role_id FROM user * WHERE ( 1 = 1 ) AND ( ( name = ? AND age = ? ) OR ( name = ? AND age = ? ) ) / @Test public void testSql() { QueryWrapper w = new QueryWrapper<>();

    w.and(i -> i.eq("1", 1))
    .nested(i ->
            i.and(j -> j.eq("name", "a").eq("age", 2))
                    .or(j -> j.eq("name", "b").eq("age", 2)));
    System.out.println(w.getSqlSegment());
    userMapper.selectList(w);
}

报错信息

上面这段代码是 官方下载的sample-wrapper 里的代码 没有任何改动。 按理说 会生成如注释一样的 SQL 但是实际生成的却是 WHERE (1 = ?) AND (name = ? AND age = ?) OR (name = ? AND age = ?)

嵌套那里少一对括号 ,对这个问题进行了多个测试 都是一样的结果,请教这个问题是怎么回事?

Comment From: sea1984619

问题自己找到了 原因在于NormalSegmentList.childrenSqlSegment() 里的 return (str.startsWith(LEFT_BRACKET) && str.endsWith(RIGHT_BRACKET)) ? str : (LEFT_BRACKET + str + RIGHT_BRACKET); 前面的判断导致本该加上的嵌套外围的括号没有加上。。 但是这最新依赖包里面的源码。 而MASTER里的源码 是直接 return (LEFT_BRACKET + str + RIGHT_BRACKET); 这样的话 就没有问题 。 那么 为啥源码不一致了?

Comment From: miemieYaho

3.3.1 = master