最近搞oracle text的全文检索功能,发现在项目中使用ibatis在查询ctxsys.dr$class这个表时,总是报错,错误如下
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in com/tc/fts/ibatis/map/CTXSYS_DRCLASS_SqlMap.xml.
--- The error occurred while preparing the mapped statement for execution.
--- Check the selectDrClass.
--- Check the SQL statement.
--- Cause: java.util.NoSuchElementException
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:615)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:589)
后来才发现表名中含有美元符,而在sqlmap中$是用来替换变量的,是sqlmap中特殊意义的字符,所以直接这么写到sql中肯定是不行的了。
可以考虑使用变量传值的方式,将表名当参数传进来。做了如下更改
调用代码:
ls = sqlMap.queryForList("selectDrClass","ctxsys.dr$class");
sqlmap代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="CTXSYS_DRCLASS" >
<select id="selectDrClass" resultClass="com.tc.fts.ibatis.model.DrClass" parameterClass="java.lang.String" >
<![CDATA[
select * from #temp# order by CLA_ID
]]>
</select>
</sqlMap>
结果发现ibatis默认将select * from #temp# order by CLA_ID变成了sql语句的参数化形式select * from ? order by CLA_ID,然后调用setString(1)了,这样最后的sql语句中表名被加了引号了。所以还是不行。
尝试直接代换法,这次OK了
调用代码:
dc.setClaName("ctxsys.dr$class");
ls = sqlMap.queryForList("selectDrClass",dc);
sqlmap代码:
<select id="selectDrClass" resultClass="com.tc.fts.ibatis.model.DrClass" parameterClass="com.tc.fts.ibatis.model.DrClass" >
<![CDATA[
select * from $claName$ order by CLA_ID
]]>
</select>
这样执行的时候sql语句就被正常代换成
select * from ctxsys.dr$class order by CLA_ID
现在又发现一种方法可以这样更符合要求,原谅我之前的做法吧
ls = sqlMap.queryForList("selectDrClass","ctxsys.dr$class");
<select id="selectDrClass"
resultClass="com.tc.fts.ibatis.model.DrClass"
parameterClass="String">
<![CDATA[
select cla_Id claid,cla_Name claname,cla_Desc cladesc from $value$ order by CLA_ID
]]>
</select>
分享到:
相关推荐
ibatis sql语句对条件中特殊字符% # 处理
在ibatis日志信息中打印SQL语句的方法(个人总结)
ibatis16个常用sql语句
iBatis最全的动态SQL语句,你需要的都有,资源在于大家共享
ibatis常用sql语句,简单易懂,方便查询,初学者宝典
ibatis常用的sql语句,很全的一篇文档。。。
因为要下载其它的文件,所以从网站复制了一些其它的资源进行上传。但是这个资源是相当有用的。这里感谢之前总结相关技术的人员。谢谢
ibatis sql 语句的编写 ,包括增删改查,很简单 很实用 ,对初学者是很好的选择
用Ibatis时,配置sql语句时候 如果直接从sql里面把语句拷出来,玩玩格式不严谨,我写了这个工具来帮助我们格式化sql语句
sql语句中用问号代替参数
WAS上log4j日志不能输出(ibatis)sql语句解决办法[借鉴].pdf
通过java程序查看ibatis配置文件中的sql语句(注:无法查看变量值)
主要是关于oracle ibatis 的一些sql
在java的控制台中看到的sql日志通常是如下的样子, Preparing: SELECT in (0,1) ORDER BY i.... 使用方法复制sql语句包括prepare丢到第一个文本框中,然后点start。转换好的就在下面了。 程序的页面可以直接双击打开。
ibatis2包和能显示执行的sql语句的ibatis2.jar 能够显示所执行的sql
SQL Map使用简单的XML配置文件将Java Bean映射成SQL语句,对比其他的数据库持续层和ORM框架(如JDO的实现,Hibernate等),SQL Map最大的优点在于它简单易学。要使用SQL Map,只要熟悉Java Bean,XML和SQL,就能使您...
根据MyBatis或iBatis的SQLMapper文件解析生成数据库表,通常是指通过解析MyBatis或iBatis的SQLMapper文件中的SQL语句,然后根据这些SQL语句来生成对应的数据库表结构。这样的需求可能源于需要将已有的SQLMapper文件...
用SqlMapClient执行SQL语句 代码例子 例子1:执行update(insert,update,delete) 例子2:查询成对象(select) 例子3:用预赋值的结果对象查询成对象(select) 例子4:查询成对象List(select) 例子5:自动提交...
将日志输出的sql语句中的问号 ? 替换成真正的参数值。 通过 "Tools -> MyBatis Log Plugin" 菜单或快捷键 "Ctrl+Shift+Alt+O" 启用。 点击窗口左边的 "Filter" 按钮,可以过滤不想要输出的sql语句。 点击窗口左边...