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