日期:2014-05-17  浏览次数:20662 次

ibatis中dynamic的一点错误,帮我查下。谢谢
<select id="queryPersonList" parameterClass="staff" resultClass="staff">
  select * from test 
<dynamic prepend="where">
<isNotEmpty prepend="and" property="username">username=#username#</isNotEmpty>
<isNotEmpty prepend="and" property="password">password=#password#</isNotEmpty>
</dynamic> 
</select>
运行上面代码一直 报错ORA-00933:
但是如果这样写就没错,
<select id="queryPersonList" parameterClass="staff" resultClass="staff">
select * from test where test.username=#username# and test.password=#password#
</select>
为什么呢?应该怎么改啊?

------解决方案--------------------
HTML code
在Ibatis中<dynamic/>是Ibatis的动态查询条件,根据该属性中所包含的元素进行判断是否执行某一条SQL语句。
1、使用dynamic时
select * from Person表
        <dynamic prepend="where">
                <isNotNull property="name" prepend="and">
                    name=#name#
                </isNotNull>
                <isNotNull property="sex" prepend="and">
                    sex=#sex#
                </isNotNull>              
        </dynamic>
结果
当name、sex都非null时打出如下的SQL语句:
select Person表 where (and) name= ? , and sex= ?,很显然执行语句时,name前的and已经自动清除。
2、不使用dynamic时
select * from Person表       
                <isNotNull property="name" prepend="and">
                    name=#name#
                </isNotNull>
                <isNotNull property="sex" prepend="and">
                    sex=#sex#
                </isNotNull>          
结果
当name、sex都非null时打出如下的sql语句:
select * Person表 where and name= ? , and sex= ?,出现语句错误。

------解决方案--------------------
可能因为你and 或者 where 后面没加空格?或者啥的 最好把sql打印出来