ibatis2.3.4.726问题一

  <select id="selectAccount" parameterClass="Account" resultMap="AccountResult">
    select
      ACC_ID ,
      ACC_FIRST_NAME ,
      ACC_LAST_NAME ,
      ACC_EMAIL 
    from ACCOUNT 
    <dynamic prepend="where">
    	<isEqual property="id" prepend="and">ACC_ID = #id#</isEqual>
		<isEqual property="firstName" prepend="and">ACC_FIRST_NAME = #firstName#</isEqual>
	</dynamic>
  </select> 

上面这段代码会带来sql错误,如果要正确,必须这样写,注意下面的空格:
  <select id="selectAccount" parameterClass="Account" resultMap="AccountResult">
    select
      ACC_ID ,
      ACC_FIRST_NAME ,
      ACC_LAST_NAME ,
      ACC_EMAIL 
    from ACCOUNT 
    <dynamic prepend="where">
    	<isEqual property="id" prepend="and"> ACC_ID = #id#</isEqual>
		<isEqual property="firstName" prepend="and"> ACC_FIRST_NAME = #firstName#</isEqual>
	</dynamic>
  </select> 


why?
com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql这个类中的方法:

  private void processBodyChildren(StatementScope statementScope, SqlTagContext ctx, Object parameterObject, Iterator localChildren, PrintWriter out) {
    while (localChildren.hasNext()) {
      SqlChild child = (SqlChild) localChildren.next();
      if (child instanceof SqlText) {
        SqlText sqlText = (SqlText) child;
        
        String sqlStatement = sqlText.getText();
        //注意此处sqlStatement应该多加一个空格才能避免以上问题,
        //下面一行代码是我个人添加
        sqlStatement = " " + sqlStatement;
        if (sqlText.isWhiteSpace()) {
          out.print(sqlStatement);
        } else if (!sqlText.isPostParseRequired()) {

          // BODY OUT
          out.print(sqlStatement);
          //....
        }
      }
    }
}

猜你喜欢

转载自sd-zyl.iteye.com/blog/1523938
今日推荐