需求:
数据库:postgresql;
数据库表中该字段存的值为 1,2,3;
要求入参为2 ;能查到该字段值有2的数据;
查询到 有一个函数满足需求:string_to_array
sql写法如下:
sql在图形化界面运行是没有问题的,但是放到mybatis里,就提示错误;
图形化界面运行结果:
-------------------------------------------------------分割线----------------------------------------------------------------
下面是报错信息:
### The error occurred while executing a query
### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, please exclude the tableName or statementId.
Error SQL: SELECT
attachmentid,
filepath AS filename
FROM
T_Attachment_File
WHERE
type = ?
and string_to_array( revise_history_id, ',') @> array ['23']
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at sun.reflect.GeneratedMethodAccessor174.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
... 128 common frames omitted
Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, please exclude the tableName or statementId.
Error SQL: SELECT
attachmentid,
filepath AS filename
FROM
T_Attachment_File
WHERE
type = ?
and string_to_array( revise_history_id, ',') @> array ['23']
at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39)
at com.baomidou.mybatisplus.core.parser.AbstractJsqlParser.parser(AbstractJsqlParser.java:74)
at com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler.sqlParser(AbstractSqlParserHandler.java:66)
at com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.intercept(PaginationInterceptor.java:127)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy293.prepare(Unknown Source)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:136)
at sun.reflect.GeneratedMethodAccessor175.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
at com.sun.proxy.$Proxy292.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
... 133 common frames omitted
Caused by: net.sf.jsqlparser.JSQLParserException: null
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:154)
at com.baomidou.mybatisplus.core.parser.AbstractJsqlParser.parser(AbstractJsqlParser.java:60)
... 148 common frames omitted
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "[\'23\']" <S_QUOTED_IDENTIFIER>
at line 8, column 64.
Was expecting one of:
"&"
"&&"
"("
"::"
";"
"<<"
">>"
"AND"
"CONNECT"
"EXCEPT"
"FOR"
"GROUP"
"HAVING"
"INTERSECT"
"MINUS"
"ORDER"
"START"
"UNION"
"^"
"|"
<EOF>
at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:19398)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:19248)
at net.sf.jsqlparser.parser.CCJSqlParser.Statements(CCJSqlParser.java:547)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:152)
... 149 common frames omitted
尝试解决方法:
1、一开始使用#号取参数,同样的报错信息;
and string_to_array( revise_history_id, ',') <![CDATA[ @> ]]> array <![CDATA[ [#{reviseHistoryId}] ]]>
2、使用$取参,相同错误;
and string_to_array( revise_history_id, ',') <![CDATA[ @> ]]> array <![CDATA[ [${reviseHistoryId}] ]]>
3、添加了单引号,里面继续使用$取参数,同样报错;
and string_to_array( revise_history_id, ',') <![CDATA[ @> ]]> array <![CDATA[ ['${reviseHistoryId}'] ]]>
单引号,双引号,#,$,都尝试过了;均无效;
-----------------------------------------------------------------------------
问题分析:
可能是由于xml里的写法问题,中括号的实现不符合要求;
---------------------------------
最终解决方案:
其实很简单,xml中可能不支持中括号的写法;
所以:
and string_to_array(revise_history_id, ',') <![CDATA[ @> ]]> string_to_array(#{reviseHistoryId}, ',')
这样就可以了,就是这么简单;