<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); //.... } } } }