64
64
* @author Clinton Begin
65
65
* @author Eduardo Macarron
66
66
* @author Iwao AVE!
67
+ * @author Kazuki Shimizu
67
68
*/
68
69
public class DefaultResultSetHandler implements ResultSetHandler {
69
70
@@ -91,6 +92,9 @@ public class DefaultResultSetHandler implements ResultSetHandler {
91
92
92
93
// Cached Automappings
93
94
private final Map <String , List <UnMappedColumnAutoMapping >> autoMappingsCache = new HashMap <String , List <UnMappedColumnAutoMapping >>();
95
+
96
+ // temporary marking flag that indicate using constructor mapping (use field to reduce memory usage)
97
+ private boolean useConstructorMappings ;
94
98
95
99
private static class PendingRelation {
96
100
public MetaObject metaObject ;
@@ -376,11 +380,10 @@ private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
376
380
377
381
private Object getRowValue (ResultSetWrapper rsw , ResultMap resultMap ) throws SQLException {
378
382
final ResultLoaderMap lazyLoader = new ResultLoaderMap ();
379
- final ResultObject resultObject = createResultObject (rsw , resultMap , lazyLoader , null );
380
- Object rowValue = resultObject .getValue ();
383
+ Object rowValue = createResultObject (rsw , resultMap , lazyLoader , null );
381
384
if (rowValue != null && !hasTypeHandlerForResultObject (rsw , resultMap .getType ())) {
382
385
final MetaObject metaObject = configuration .newMetaObject (rowValue );
383
- boolean foundValues = resultObject . isUseConstructorMappings () ;
386
+ boolean foundValues = this . useConstructorMappings ;
384
387
if (shouldApplyAutomaticMappings (resultMap , false )) {
385
388
foundValues = applyAutomaticMappings (rsw , resultMap , metaObject , null ) || foundValues ;
386
389
}
@@ -568,7 +571,8 @@ private CacheKey createKeyForMultipleResults(ResultSet rs, ResultMapping resultM
568
571
// INSTANTIATION & CONSTRUCTOR MAPPING
569
572
//
570
573
571
- private ResultObject createResultObject (ResultSetWrapper rsw , ResultMap resultMap , ResultLoaderMap lazyLoader , String columnPrefix ) throws SQLException {
574
+ private Object createResultObject (ResultSetWrapper rsw , ResultMap resultMap , ResultLoaderMap lazyLoader , String columnPrefix ) throws SQLException {
575
+ this .useConstructorMappings = false ; // reset previous mapping result
572
576
final List <Class <?>> constructorArgTypes = new ArrayList <Class <?>>();
573
577
final List <Object > constructorArgs = new ArrayList <Object >();
574
578
Object resultObject = createResultObject (rsw , resultMap , constructorArgTypes , constructorArgs , columnPrefix );
@@ -582,8 +586,8 @@ private ResultObject createResultObject(ResultSetWrapper rsw, ResultMap resultMa
582
586
}
583
587
}
584
588
}
585
- final boolean useConstructorMappings = (resultObject != null && !constructorArgTypes .isEmpty ());
586
- return new ResultObject ( resultObject , useConstructorMappings ) ;
589
+ this . useConstructorMappings = (resultObject != null && !constructorArgTypes .isEmpty ()); // set current mapping result
590
+ return resultObject ;
587
591
}
588
592
589
593
private Object createResultObject (ResultSetWrapper rsw , ResultMap resultMap , List <Class <?>> constructorArgTypes , List <Object > constructorArgs , String columnPrefix )
@@ -852,11 +856,10 @@ private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey c
852
856
ancestorObjects .remove (resultMapId );
853
857
} else {
854
858
final ResultLoaderMap lazyLoader = new ResultLoaderMap ();
855
- final ResultObject resultObject = createResultObject (rsw , resultMap , lazyLoader , columnPrefix );
856
- rowValue = resultObject .getValue ();
859
+ rowValue = createResultObject (rsw , resultMap , lazyLoader , columnPrefix );
857
860
if (rowValue != null && !hasTypeHandlerForResultObject (rsw , resultMap .getType ())) {
858
861
final MetaObject metaObject = configuration .newMetaObject (rowValue );
859
- boolean foundValues = resultObject . isUseConstructorMappings () ;
862
+ boolean foundValues = this . useConstructorMappings ;
860
863
if (shouldApplyAutomaticMappings (resultMap , true )) {
861
864
foundValues = applyAutomaticMappings (rsw , resultMap , metaObject , columnPrefix ) || foundValues ;
862
865
}
@@ -1101,19 +1104,4 @@ private boolean hasTypeHandlerForResultObject(ResultSetWrapper rsw, Class<?> res
1101
1104
return typeHandlerRegistry .hasTypeHandler (resultType );
1102
1105
}
1103
1106
1104
- private static class ResultObject {
1105
- private final Object value ;
1106
- private final boolean useConstructorMappings ;
1107
- private ResultObject (Object value , boolean useConstructorMappings ) {
1108
- this .value = value ;
1109
- this .useConstructorMappings = useConstructorMappings ;
1110
- }
1111
- private Object getValue () {
1112
- return value ;
1113
- }
1114
- private boolean isUseConstructorMappings () {
1115
- return useConstructorMappings ;
1116
- }
1117
- }
1118
-
1119
1107
}
0 commit comments