MyBatisPlus中IN的使用
原java代码块
Page<CrmCustomer> customerPage = baseMapper.selectPage(page, Wrappers.lambdaQuery(crmCustomer)
.eq(CrmCustomer::getOpenSeaFlag, CommonConstants.ZERO)
.in(CrmCustomer::getUserId, userIdList));
查询条件userList,当userList为空的时候会报错误
Encountered unexpected token: "IN" "IN"
at line 7, column 14.
Was expecting one of:
"&"
")"
"::"
"<<"
">>"
"COLLATE"
"["
"^"
"|"
at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:31468) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:31301) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9818) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9696) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9678) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:9649) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.WhereClause(CCJSqlParser.java:9037) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5667) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5867) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5516) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:5511) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:232) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:153) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:188) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:63) ~[jsqlparser-4.4.jar:na]
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:38) ~[jsqlparser-4.4.jar:na]
at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:49) ~[mybatis-plus-extension-3.5.3.1.jar:3.5.3.1]
... 160 common frames omitted
MyBatisPlus中in的源码如下
protected ISqlSegment inExpression(Object[] values) {
if (ArrayUtils.isEmpty(values)) {
return () -> "()";
}
return () -> Arrays.stream(values).map(i -> formatParam(null, i))
.collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
}
可以看到当数据为空的时候直接返回了一个“()”,解析到sql执行的时候就是
select * from crm_customer where user_id in ()
显然这样sql是无法解析的,因此在使用in传入集合参数的时候要判断是否为空。