为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:windows 7
【CPU】:Intel
【问题描述】*:
脚本语句如下:
select
detail.id as "id",
detail.work_days as "work_days",
detail.on_guard as "on_guard",
detail.no_guard as "no_guard",
detail.remark as "remark",
<if test="tkeys != null">
<foreach collection="tkeys" item="item">
detail.${item.key1} as #{item.key2},
</foreach>
</if>
detail.the_year_month
from
hr_attendance_detail detail
where detail.remark = #{remark}
该语句特殊点是在字段这边写了动态显示字段,初步怀疑是里面的 ? 没有进行替换
mybatis执行的时候,会报
Caused by: dm.jdbc.driver.DMException: 第 9 行, 第 47 列[?]附近出现错误:
语法分析出错
语法分析出错
语法分析出错
; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 9 行, 第 47 列[?]附近出现错误:
语法分析出错
at dm.jdbc.driver.DBError.throwException(DBError.java:684)
at dm.jdbc.b.b.o.G(MSG.java:554)
at dm.jdbc.b.b.o.D(MSG.java:514)
at dm.jdbc.b.b.o.C(MSG.java:495)
at dm.jdbc.b.a.a(DBAccess.java:219)
at dm.jdbc.b.a.a(DBAccess.java:607)
at dm.jdbc.driver.DmdbPreparedStatement.prepareSql(DmdbPreparedStatement.java:267)
at dm.jdbc.driver.DmdbPreparedStatement.allocateHandle(DmdbPreparedStatement.java:224)
at dm.jdbc.driver.DmdbPreparedStatement.<init>(DmdbPreparedStatement.java:126)
at dm.jdbc.driver.DmdbPreparedStatement.<init>(DmdbPreparedStatement.java:176)
at dm.jdbc.driver.DmdbConnection.do_prepareStatement(DmdbConnection.java:698)
at dm.jdbc.driver.DmdbConnection.do_prepareStatement(DmdbConnection.java:684)
at dm.jdbc.driver.DmdbConnection.prepareStatement(DmdbConnection.java:1316)
at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337)
at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:87)
at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:128)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy636.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at sun.reflect.GeneratedMethodAccessor383.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)
该语句在mysql下是能正常执行,传入的参数也是正确的,跟踪调用链,是这边抛出的错误
#占位符替换别名使用导致的,建议使用$占位符试下
detail.$(item.key1} as ${item.key2}