IBatis is not able to tackle selects with subsets of columns fetched defined in the resultMap ---------------------------------------------------------------------------------------------
Key: IBATIS-545 URL: https://issues.apache.org/jira/browse/IBATIS-545 Project: iBatis for Java Issue Type: Bug Components: Build/Deployment Reporter: Priya Dani IBatis is not able to handle the select statements which fetch only a subset of the columns defined in its resultMap. I have a scenario in which the select query fetches dynamic number of colums each time but maps to a static resultMap which contain the superset of the possible columns that can be fetched from the query . For eg. <resultMap id="EntityMap" class="Entity"> <result property="code" column="cd_entity" /> <result property="name" column="nm_entity" /> </ resultMap > <select id="selectAllEntities" resultMap="EntityMap"> select * from entity </ select > <select id="selectAllEntitiesCodes" resultMap="EntityMap"> select cd_entity from entity </select> In the second query when I set the selective attribute (only cd_entity) to be fetched , a SQL Exception is thrown saying- "Invalid column name 'nm_entity'. Check the resultMap set" . The error occurs because in the resultMap 'EntityMap' we are using nm_entity but not really fetching the value from select statement. When I went through the IBatis documentation, I found one solution using "remapResults" property with the select or statement which remaps the results if set to true everytime the query is run. I used something like the following using IBatis version 2.3.4.726:- <select id="selectAllEntitiesCodes" resultMap="EntityMap" remapResults="true"> select cd_entity from entity </select> But this doesn't help me out with my problem. Later tried hacking the source code of IBatis 2.3.4. What I found is the issue comes when the IBatis tries to iterate through all the properties in the resultMap and tries to get the result from the sql resultSet passing the column name mapped to each property in the resultMap. Obviously, it fails to get the value from the resultSet for the columns not fetched in the select query and throws an SQL Exception. So I tried making a small patch for it by making a small change in the java file 'StringTypeHandler.java' like this: I kept the statment inside try/catch block which fetches the specific column from the resultSet and the function getResult() return null instead of throwing an exception. public Object getResult(ResultSet rs, String columnName) throws SQLException { Object s; try{ s = rs.getString(columnName); } catch (SQLException e) { return null; } if(rs.wasNull()){ return null; } else{ return s; } } This small hack solved at least my purpose. I do agree this patch is not the right way to come out of the problem since for any other reason which can throw SQLException I am catching it out and never letting any other person know about the actual issue that causes SQL Exception to be thrown. Please suggest me what can be the right way to come out of this problem of using a single resultMap for the selects which fetches dynamic number of columns. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.