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.