MyBatisPlus中IN的使用

发布时间 2023-09-01 17:07:45作者: leepandar

原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传入集合参数的时候要判断是否为空。