Title: Change proposal for BasicResultMap.getResults(RequestScope request, ResultSet rs)

Hi,

We tried to implement the HashMaps as results for our queries. The problem is, that whenever a HashMap is set as the resultClass, a queryForObject is called and so, every select can only return ONE result. In our application we expect a list of HashMaps at certain locations. The solution for our problem would be very simple and - in our opinion - would work with only three new lines of code:


The Method BasicResultMap.getResults(RequestScope request, ResultSet rs) the targetType for further calls is set:


if (resultClass == null) {
        throw new SqlMapException("The result class was null when trying to get results for ResultMap named " + getId() + ".");

} else if (Map.class.isAssignableFrom(resultClass)) {
        columnValues[i] = getNestedSelectMappingValue(request, rs, mapping, Object.class);
}
else if (DomTypeMarker.class.isAssignableFrom(resultClass)) {
        Class javaType = mapping.getJavaType();
        if (javaType == null) {
                javaType = DomTypeMarker.class;
        }
        columnValues[i] = getNestedSelectMappingValue(request, rs, mapping, javaType);
} else {
        Probe p = ProbeFactory.getProbe(resultClass);
        Class type = p.getPropertyTypeForSetter(resultClass, mapping.getPropertyName());
        columnValues[i] = getNestedSelectMappingValue(request, rs, mapping, type);
}



The bold part would have to be changed (exactly like the next else-Statement):


if (resultClass == null) {
        throw new SqlMapException("The result class was null when trying to get results for ResultMap named " + getId() + ".");

} else if (Map.class.isAssignableFrom(resultClass)) {
        Class javaType = mapping.getJavaType();
        if (javaType == null) {
                javaType = Object.class;
        }
        columnValues[i] = getNestedSelectMappingValue(request, rs, mapping, javaType);
}
else if (DomTypeMarker.class.isAssignableFrom(resultClass)) {
        Class javaType = mapping.getJavaType();
        if (javaType == null) {
                javaType = DomTypeMarker.class;
        }
        columnValues[i] = getNestedSelectMappingValue(request, rs, mapping, javaType);
} else {
        Probe p = ProbeFactory.getProbe(resultClass);
        Class type = p.getPropertyTypeForSetter(resultClass, mapping.getPropertyName());
        columnValues[i] = getNestedSelectMappingValue(request, rs, mapping, type);
}

As you can see, the changes would have no effect, if no javaType was set. But for our concerns, we would set the javaType to java.util.ArrayList and everything would be just fine!


Stefan

Reply via email to