iBatis的SqlMap中,我写的这条动态SQL语句,将表名当做参数动态传递,报“表名无效”错误。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iBatis的SqlMap中,我写的这条动态SQL语句,将表名当做参数动态传递,报“表名无效”错误。相关的知识,希望对你有一定的参考价值。

select * from
<dynamic>
<isNotEmpty property="table">
#table:VARCHAR#
</isNotEmpty>
</dynamic>
<dynamic prepend="where">
<isNotEmpty prepend="and" property="fpdm">
t.send_fpdm = #fpdm:VARCHAR#
</isNotEmpty>
<isNotEmpty prepend="and" property="begin">
to_number(t.send_begin_fphm)<![CDATA[ >= ]]>to_number(#begin:VARCHAR#)
</isNotEmpty>
<isNotEmpty prepend="and" property="end">
to_number(t.send_end_fphm)<![CDATA[ <= ]]>to_number(#end:VARCHAR#)
</isNotEmpty>
</dynamic>

<dynamic>属性难道只能用于where吗?为什么动态添加表就错呢?
在线等,谢谢!

因为#value#这种形式的,转换为SQL中的?,而问号只有在赋值属性(字段)的时候才用,表名不能用这个方式写,而且更不要用$value$这种形式替换,因为ibatis编译的SQL会缓存。导致第二次传递进来的表名不会替换,在表可数的情况下,可以传递一个变量,来判断需要查询哪个表。 参考技术A 表名称需要使用“$”而不是“#”追问

谢谢,不过还没有实验。等验证正确了再给你满意答案。还有个问题:如果表可以通过用“$”动态组建SQL语句,那不是带来另一个问题:一旦这个表这个参数值为空,这条SQL语句岂不是错误了吗?iBatis有什么机制避免吗?

追答

为空的话,会报错的,具体怎么样避免,还没有用过

本回答被提问者采纳

以上是关于iBatis的SqlMap中,我写的这条动态SQL语句,将表名当做参数动态传递,报“表名无效”错误。的主要内容,如果未能解决你的问题,请参考以下文章

ibatis 执行多条sql问题

ibatis 中 $与#的区别

表变量批量插入的这条 SQL 语句有啥问题

在ibatis及mybatis的sqlmap配置文件中应使用啥符号进行安全预编译参数绑定

NoClassDefFoundError: com/ibatis/sqlmap/engine/transaction/external/ExternalTransactionConfig处理(示例代码

ibatis中$$和##的区别