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

mybatis-plus-boot-starter-3.5.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

一个类继承JsqlParserSupport后重写processSelect方法,在方法中向原where中插入了一个正则查询条件如 xxx REGEXP '.*?3', 这时?会被替换为预处理的参数,导致最后的一个真正的预处理占位符?获取不到参数报错

重现步骤(如果有就写完整)

RegExpMySQLOperator itemsList = new RegExpMySQLOperator(RegExpMatchOperatorType.MATCH_CASEINSENSITIVE); itemsList.setLeftExpression(new StringValue("xxx")); itemsList.setRightExpression(new StringValue('.*?3'));

报错信息

SELECT * FROM mall m WHERE xxx REGEXP '.*15024840379002511383' AND m.del_flag = '0' AND xx IN (1502484037900251138, error); ---This is an error sql!---

Comment From: miemieYaho

mybatis就这样的

Comment From: baigem

mybatis就这样的

所以这就是规则不是bug吗?按逻辑来说StringValue对象里面的都是字符串,字符串不应该参与对应的各种关键字才对,预处理占位符怎么会检查到字符串呢,而且就REGEXP会这样,RLIKE就不会

Comment From: baigem

而且开启分页之后分页查询是正常的并没有把?当做预处理占位符,但是正式请求就出现这种情况,感觉是个bug吧?

Comment From: miemieYaho

mp不会参与这个部分的处理,怎么处理你这问号是mybatis在处理