Index: src/com/ibatis/sqlmap/engine/mapping/result/loader/EnhancedLazyResultLoader.java =================================================================== --- src/com/ibatis/sqlmap/engine/mapping/result/loader/EnhancedLazyResultLoader.java (Revision 772088) +++ src/com/ibatis/sqlmap/engine/mapping/result/loader/EnhancedLazyResultLoader.java (Arbeitskopie) @@ -15,20 +15,20 @@ */ package com.ibatis.sqlmap.engine.mapping.result.loader; -import com.ibatis.common.beans.ClassInfo; - -import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl; -import com.ibatis.sqlmap.engine.type.DomTypeMarker; -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.InvocationHandler; - import java.lang.reflect.Method; -import java.lang.reflect.Proxy; import java.sql.SQLException; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Set; +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.InvocationHandler; + +import com.ibatis.common.beans.ClassInfo; +import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl; +import com.ibatis.sqlmap.engine.type.DomTypeMarker; + /** * Class to lazily load results into objects (uses CGLib to improve performance) */ @@ -97,6 +97,16 @@ * @throws SQLException if there is a problem */ public Object loadResult() throws SQLException { + // return null if the parameter object is null + if (parameterObject == null) { + return null; + } + if (parameterObject instanceof Map) { + if (((Map) parameterObject).isEmpty()) { + return null; + } + } + if (DomTypeMarker.class.isAssignableFrom(targetType)) { return ResultLoader.getResult(client, statementName, parameterObject, targetType); } else if (Collection.class.isAssignableFrom(targetType)) { Index: src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java =================================================================== --- src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java (Revision 772088) +++ src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java (Arbeitskopie) @@ -590,10 +590,17 @@ while (parser.hasMoreTokens()) { String propName = parser.nextToken(); String colName = parser.nextToken(); + boolean ignoreNullValue = false; + if (colName.endsWith("?")) { + ignoreNullValue = true; + colName = colName.substring(0, colName.length() - 1); + } Class propType = PROBE.getPropertyTypeForSetter(parameterObject, propName); TypeHandler propTypeHandler = typeHandlerFactory.getTypeHandler(propType); Object propValue = propTypeHandler.getResult(rs, colName); - PROBE.setObject(parameterObject, propName, propValue); + if (propValue != null || !ignoreNullValue) { + PROBE.setObject(parameterObject, propName, propValue); + } } } else { // single param