[ https://issues.apache.org/jira/browse/IBATIS-476?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Clinton Begin closed IBATIS-476. -------------------------------- Resolution: Won't Fix Fix Version/s: (was: 2.3.1) Assignee: Clinton Begin Unfortunately remapResults is strictly for AutoMapping situations... it will not affect the behavior of explicit result maps.... There's already a feature request for ignoring missing columns and/or automapping remaining columns. However, it is unlikely that 2.x will ever see those features. 3.0 will... sorry. > Mapping of non-existent columns causes error when defining ResultMaps > --------------------------------------------------------------------- > > Key: IBATIS-476 > URL: https://issues.apache.org/jira/browse/IBATIS-476 > Project: iBatis for Java > Issue Type: Improvement > Components: SQL Maps > Affects Versions: 2.3.0 > Environment: Windows XP / JBoss 4.0.5 / Oracle / Teradata > Reporter: Adam Parrish > Assignee: Clinton Begin > > I defined the following resultMap > <resultMap > id="StatusResult" > class="mil.af.gcssdsrf.led.lims.dto.StatusRow" > > > <result property="reportingDate" column="reportingDate" > javaType="java.util.Date" jdbcType="DATE"/> > <result property="grouping" resultMap="StatusRow.GroupResult"/> > <result property="mcHours" column="mcHours"/> > <result property="fmcHours" column="fmcHours"/> > <result property="pmcHours" column="pmcHours"/> > <result property="nmcmHours" column="nmcmHours"/> > <result property="nmcbHours" column="nmcbHours"/> > <result property="tnmcmHours" column="tnmcmHours"/> > <result property="nmcsHours" column="nmcsHours"/> > <result property="tnmcsHours" column="tnmcsHours"/> > <result property="possessedHours" column="possessedHours"/> > <result property="tpmcsHours" column="tpmcsHours"/> > <result property="tnmcHours" column="tnmcHours"/> > <result property="tpmcmHours" column="tpmcmHours"/> > <result property="mcRate" column="mcRate"/> > <result property="fmcRate" column="fmcRate"/> > <result property="pmcRate" column="pmcRate"/> > <result property="nmcmRate" column="nmcmRate"/> > <result property="nmcsRate" column="nmcsRate"/> > <result property="nmcbRate" column="nmcbRate"/> > <result property="tnmcmRate" column="tnmcmRate"/> > <result property="tnmcsRate" column="tnmcsRate"/> > <result property="tpmcsRate" column="tpmcsRate"/> > <result property="tnmcRate" column="tnmcRate"/> > <result property="tpmcmRate" column="tpmcmRate"/> > </resultMap> > <resultMap > id="GroupResult" > class="mil.af.gcssdsrf.led.lims.dto.Group" > > > <result property="airForceGrouping" column="leadCommand"/> > <result property="theater" column="theater"/> > <result property="command" column="command"/> > <result property="organization" column="organization"/> > <result property="types" column="familyType"/> > <result property="designs" column="design"/> > <result property="serieses" column="series"/> > </resultMap> > When I do the following query: > <select > id="status" > resultMap="StatusResult" > > parameterClass="mil.af.gcssdsrf.led.lims.service.request.FilteredAndGroupedRequest" > remapResults="true"> > SELECT > <isNotNull property="grouping" removeFirstPrepend="true"> > <isEqual prepend="," > property="grouping.groupByStartDate" compareValue="true"> > reportingDate > </isEqual> > <isEqual prepend="," > property="grouping.groupByAirforceGrouping" compareValue="true"> > leadCommand > </isEqual> > <isEqual prepend="," property="grouping.groupByTheater" > compareValue="true"> > theater > </isEqual> > <isEqual prepend="," property="grouping.groupByCommand" > compareValue="true"> > command > </isEqual> > <isEqual prepend="," > property="grouping.groupByOrganization" compareValue="true"> > organization > </isEqual> > <isEqual prepend="," property="grouping.groupByType" > compareValue="true"> > familyType > </isEqual> > <isEqual prepend="," property="grouping.groupByDesign" > compareValue="true"> > design > </isEqual> > <isEqual prepend="," property="grouping.groupBySeries" > compareValue="true"> > series > </isEqual> > > > </isNotNull> > ,sum(mcHours) as mcHours, > sum(fmcHours) as fmcHours, > sum(pmcHours) as pmcHours, > sum(nmcmHours) as nmcmHours, > sum(nmcbHours) as nmcbHours, > sum(tnmcmHours) as tnmcmHours, > sum(nmcsHours) as nmcsHours, > sum(tnmcsHours) as tnmcsHours, > sum(possessedHours) as possessedHours, > sum(tpmcsHours) as tpmcsHours, > sum(tnmcHours) as tnmcHours, > sum(tpmcmHours) as tpmcmHours, > sum(mcHours) / sum(possessedHours) as mcRate, > sum(fmcHours) / sum(possessedHours)as fmcRate, > sum(pmcHours) / sum(possessedHours)as pmcRate, > sum(nmcmHours) / sum(possessedHours)as nmcmRate, > sum(nmcsHours) / sum(possessedHours)as nmcsRate, > sum(nmcbHours) / sum(possessedHours)as nmcbRate, > sum(tnmcmHours) / sum(possessedHours)as tnmcmRate, > sum(tnmcsHours) / sum(possessedHours)as tnmcsRate, > sum(tpmcsHours) / sum(possessedHours)as tpmcsRate, > sum(tnmcHours) / sum(possessedHours)as tnmcRate, > sum(tpmcmHours) / sum(possessedHours)as tpmcmRate > FROM status_table > GROUP BY > <isNotNull property="grouping" removeFirstPrepend="true"> > <isEqual prepend="," > property="grouping.groupByStartDate" compareValue="true"> > reportingDate > </isEqual> > <isEqual prepend="," > property="grouping.groupByAirforceGrouping" compareValue="true"> > leadCommand > </isEqual> > <isEqual prepend="," property="grouping.groupByTheater" > compareValue="true"> > theater > </isEqual> > <isEqual prepend="," property="grouping.groupByCommand" > compareValue="true"> > command > </isEqual> > <isEqual prepend="," > property="grouping.groupByOrganization" compareValue="true"> > organization > </isEqual> > <isEqual prepend="," property="grouping.groupByType" > compareValue="true"> > familyType > </isEqual> > <isEqual prepend="," property="grouping.groupByDesign" > compareValue="true"> > design > </isEqual> > <isEqual prepend="," property="grouping.groupBySeries" > compareValue="true"> > series > </isEqual> > > > </isNotNull> > ORDER BY > <isNotNull property="grouping" removeFirstPrepend="true"> > <isEqual prepend="," > property="grouping.groupByStartDate" compareValue="true"> > reportingDate > </isEqual> > <isEqual prepend="," > property="grouping.groupByAirforceGrouping" compareValue="true"> > leadCommand > </isEqual> > <isEqual prepend="," property="grouping.groupByTheater" > compareValue="true"> > theater > </isEqual> > <isEqual prepend="," property="grouping.groupByCommand" > compareValue="true"> > command > </isEqual> > <isEqual prepend="," > property="grouping.groupByOrganization" compareValue="true"> > organization > </isEqual> > <isEqual prepend="," property="grouping.groupByType" > compareValue="true"> > familyType > </isEqual> > <isEqual prepend="," property="grouping.groupByDesign" > compareValue="true"> > design > </isEqual> > <isEqual prepend="," property="grouping.groupBySeries" > compareValue="true"> > series > </isEqual> > > > </isNotNull> > </select> > I sometimes will receive exceptions because the type handlers attempt to load > a column from the result set regardless of the fact that it doesn't exist. My > impression was that this was a reason to turn on remapResults=true, but that > functionality did not operate as expected. > My solution was to modify the type handlers in your code and rebuild the jar. > The following files were affected in my code > C:\Documents and Settings\aparrish\flex3workspaces\majcom\iBatisMapper>svn > stat > M src\com\ibatis\sqlmap\engine\type\StringTypeHandler.java > M src\com\ibatis\sqlmap\engine\type\BaseTypeHandler.java > M src\com\ibatis\sqlmap\engine\type\DateTypeHandler.java > M src\com\ibatis\sqlmap\engine\type\DateOnlyTypeHandler.java > The following lines change > C:\Documents and Settings\aparrish\flex3workspaces\majcom\iBatisMapper>svn > diff > Index: src/com/ibatis/sqlmap/engine/type/StringTypeHandler.java > =================================================================== > --- src/com/ibatis/sqlmap/engine/type/StringTypeHandler.java (revision > 601753 > ) > +++ src/com/ibatis/sqlmap/engine/type/StringTypeHandler.java (working copy) > @@ -32,12 +32,16 @@ > public Object getResult(ResultSet rs, String columnName) > throws SQLException { > - Object s = rs.getString(columnName); > - if (rs.wasNull()) { > - return null; > - } else { > - return s; > - } > + if(columnExists(rs, columnName)) { > + Object s = rs.getString(columnName); > + if (rs.wasNull()) { > + return null; > + } else { > + return s; > + } > + } else { > + return null; > + } > } > public Object getResult(ResultSet rs, int columnIndex) > Index: src/com/ibatis/sqlmap/engine/type/BaseTypeHandler.java > =================================================================== > --- src/com/ibatis/sqlmap/engine/type/BaseTypeHandler.java (revision > 601753 > ) > +++ src/com/ibatis/sqlmap/engine/type/BaseTypeHandler.java (working copy) > @@ -15,11 +15,25 @@ > */ > package com.ibatis.sqlmap.engine.type; > +import java.sql.ResultSet; > +import java.sql.SQLException; > + > /** > * Base type handler for convenience > */ > public abstract class BaseTypeHandler implements TypeHandler { > + > + protected boolean columnExists(ResultSet rs, String columnName) { > + try { > + rs.findColumn(columnName); > + return true; > + } catch (SQLException e) { > + System.out.println("Column wasn't found, swallowing > exception" > ); > + return false; > + } > + } > + > public boolean equals(Object object, String string) { > if (object == null || string == null) { > return object == string; > Index: src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java > =================================================================== > --- src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java (revision > 601753 > ) > +++ src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java (working copy) > @@ -35,12 +35,16 @@ > public Object getResult(ResultSet rs, String columnName) > throws SQLException { > - java.sql.Timestamp sqlTimestamp = rs.getTimestamp(columnName); > - if (rs.wasNull()) { > - return null; > - } else { > - return new java.util.Date(sqlTimestamp.getTime()); > - } > + if(columnExists(rs, columnName)) { > + java.sql.Timestamp sqlTimestamp = rs.getTimestamp(columnName); > + if (rs.wasNull()) { > + return null; > + } else { > + return new java.util.Date(sqlTimestamp.getTime()); > + } > + } else { > + return null; > + } > } > public Object getResult(ResultSet rs, int columnIndex) > Index: src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java > =================================================================== > --- src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java (revision > 601753 > ) > +++ src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java (working copy) > @@ -35,12 +35,16 @@ > public Object getResult(ResultSet rs, String columnName) > throws SQLException { > - java.sql.Date sqlDate = rs.getDate(columnName); > - if (rs.wasNull()) { > - return null; > - } else { > - return new java.util.Date(sqlDate.getTime()); > - } > + if(columnExists(rs, columnName)) { > + java.sql.Date sqlDate = rs.getDate(columnName); > + if (rs.wasNull()) { > + return null; > + } else { > + return new java.util.Date(sqlDate.getTime()); > + } > + } else { > + return null; > + } > } > public Object getResult(ResultSet rs, int columnIndex) > Is there any reason to believe that this is something that others would want > to use, or a more elegant way to solve this problem to plugin to the iBatis > framework. This solution works for my needs, but is there a way to configure > this functionality so that others could leverage it if need be. > Alternatively is this functionality already built in and I am using something > improperly? > Thanks for your time and please let me know if someone wants me to help > contribute back. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.