ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Nathan Maves <Nathan.Ma...@Sun.COM>
Subject Re: Bug with CTH and order of a ResultMap
Date Tue, 08 Mar 2005 07:02:41 GMT
Jean-Francois,

You are once again the answer man!

I am not sure how those lines got switched around but that did the 
trick.  After changing about 8 CTH and running my unit tests, 
everything runs perfect.

Nathan
On Mar 7, 2005, at 5:18 PM, Jean-Francois Poilpret wrote:

> Hello Nathan,
>
> The answer to this problem is easy: iBATIS ResultGetter is just a 
> wrapper
> around JDBC ResultSet getter methods.
> If you have a look at the JDBC doc, you will see that wasNull() must be
> called _after_ getXxxx() for one given column, ie, wasNull() will tell 
> you
> if the _last column you have read_ was null or not (not the column you 
> are
> about to read).
>
> So you should write your CTH that way:
>      public Object getResult(ResultGetter getter) throws SQLException {
>          int value = getter.getInt();
>          if (getter.wasNull())
>              return null;
>          return TimeZone.findEnumeration(value);
>      }
>
> That's all!
> By the way, thank you for reporting this problem: I have coded my own 
> CTH
> the same way, but I could not exhibit this problem because in fact, the
> current column and the previous column in my own table are not 
> nullable.
>
> Cheers
>
> 	Jean-Francois
>
> -----Original Message-----
> From: Nathan Maves [mailto:Nathan.Maves@Sun.COM]
> Sent: Tuesday, March 08, 2005 3:48 AM
> To: ibatis-user-java@incubator.apache.org
> Subject: Re: Bug with CTH and order of a ResultMap
>
> Anyone had a chance to look at this issue yet?
>
> 	Nathan
>
> On Mar 3, 2005, at 9:46 AM, Nathan Maves wrote:
>
>> Team,
>>
>> I know that this was not the intended way to use CTH but it works 99%
>> of the time!
>>
>> The 1% of the time that it fails is really strange.  It will only fail
>> if the column before it in the result map is null.  In the example
>> below I can get it to work if I move the line
>>
>> 	<result property="timeZone" column="time_zone"/>
>>
>> after a result that is NOT null.
>>
>> I am not sure why this is happening.  I thought that the order of the
>> result map meant nothing.
>>
>> Nathan
>>
>> SqlMapConfig
>>
>> 	<typeAlias alias="TimeZone"
>> type="giveservice.domain.definitions.TimeZone"/>
>>
>>     <typeHandler javaType="TimeZone"
>> callback="giveservice.dao.ibatis.typeHandler.TimeZoneCTH"/>
>>
>>
>> CTH
>> 	public class TimeZoneCTH implements TypeHandlerCallback {
>>
>>     public Object getResult(ResultGetter getter) throws SQLException {
>>         if (getter.wasNull())
>>             return null;
>>         int value = getter.getInt();
>>         return TimeZone.findEnumeration(value);
>>     }
>>
>>     public void setParameter(ParameterSetter setter, Object parameter)
>> throws SQLException {
>>         if (parameter == null) {
>>             setter.setNull(Types.INTEGER);
>>         } else {
>>             TimeZone param = (TimeZone) parameter;
>>             setter.setInt(param.getDatabaseId());
>>         }
>>     }
>>
>>     public Object valueOf(String s){
>>         return s;
>>     }
>>
>> }
>>
>> ResultMap Working
>>
>> 	<resultMap id="simpleRequestResultMap" class="Request">
>>         <result property="id" column="id"/>
>>         ...
>>         <result property="partner" column="partner"/>
>>         <result property="partnerName" column="partner_name"/>
>>         <result property="partnerEmail" column="partner_email"/>
>>         <result property="partnerPhone" column="partner_phone"/>
>>         <result property="contractNumber" column="contract_number"/>
>>         <result property="timeZone" column="time_zone"/>
>>         ...
>>     </resultMap>
>>
>> ResultMap NOT Working! < Notice the order in regards to the time_zone
>> column >
>>
>> 	<resultMap id="simpleRequestResultMap" class="Request">
>>         <result property="id" column="id"/>
>>         ...
>>         <result property="partner" column="partner"/>
>>         <result property="partnerName" column="partner_name"/>
>>         <result property="partnerEmail" column="partner_email"/>
>>         <result property="partnerPhone" column="partner_phone"/>
>> 		<result property="timeZone" column="time_zone"/>
>>         <result property="contractNumber" column="contract_number"/>
>>         ...
>>     </resultMap>
>>
>
>
>


Mime
View raw message