|
Thanks. I’ll add these to my bag ‘o
tricks. From: Firas A.
[mailto:[EMAIL PROTECTED] Hello, I had a similar problem and these
were my alternatives: 1) Use CASE SQL _expression_ and return true/false, ex:
2) Modify the setter/getter methods of the
boolean property like this:
In my case, the second alternative
was better choise. Hope this help. </Firas> From: Rick
[mailto:[EMAIL PROTECTED] Comments below… From: Jeff Butler
[mailto:[EMAIL PROTECTED] A custom type handler is the right way to do it. Your code looks
amazingly similar to the example for this exact problem in the developer's
guide :) (Great minds think alike…) **What developers guide? I just searched the iBatis developer guide
(the PDF file) for the string “TypeHandler” and it is not in there. Is this a future version of the developers
guide? The one I downloaded on 6/16/2006 does not seem to have this (or did I
miss it). You could register the type handler globally so it would always handle
any VARCHAR to boolean transalation. **Nice idea. This app handles all Booleans
as VARCHAR(1) Y or N. This is what's shown in the developer's guide. Specifying the
type handler for a specific field in a result is fairly new - we do need to get
that into the documentation. I'll get to that tomorrow (hopefully). ** Perhaps in the FAQ as well. I am more
than happy to update the FAQ. Jeff Butler
On 6/28/06, Rick
<[EMAIL PROTECTED]>
wrote: I found the answer (just by trial and error no documentation
per se). Can you tell me if there is a easier/better way? I created a custom type handler and used it as follows:
<resultMap id= "contacts" class ="qcom.cas.mysourcej.poc.model.Contact" >
<result property= "name" column ="contact_name" />
<result property= "primaryContact" column ="primary_contact"
typeHandler= "qcom.cas.commons.ibatis.typehandler.StringBooleanTypeHandler"
/>
</resultMap > package qcom.cas.commons.ibatis.typehandler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.ibatis.sqlmap.engine.type.TypeHandler; public class StringBooleanTypeHandler implements TypeHandler
{
public void setParameter(PreparedStatement ps, int position, Object value,
String jdbcType) throws SQLException {
Boolean bValue = (Boolean) value;
ps.setString(position, bValue.booleanValue() ? "Y" : "N");
}
public Object getResult(ResultSet rs, String name) throws SQLException {
return valueOf(rs.getString(name));
}
public Object getResult(ResultSet rs, int position) throws SQLException {
return valueOf(rs.getString(position));
}
public Object getResult(CallableStatement cs, int position)
throws SQLException {
return valueOf(cs.getString(position));
}
public Object valueOf(String value) {
if (value.equals("Y")) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}
public boolean equals(Object value1, String value2) {
return valueOf(value2).equals(value1);
} } Can you tell me if there is a easier/better way? From: Rick [mailto: [EMAIL PROTECTED]]
I
have a SQL map as follows:
<resultMap id= "contacts" class ="qcom.cas.mysourcej.poc.model.Contact" >
<result property= "name" column ="contact_name" />
<result property= "primaryContact" column ="primary_contact"
/>
</resultMap > The
class Contact has a primaryContact field is boolean The
result set is from a column that is equal to 'Y' or 'N' in the database. Is there
a way to map a boolean property (primitive) to a VARCHAR(1) NOT NULL column
(that has either a 'Y' or a 'N')? This
is a legacy database and there is no way I can change the table. I could change
the query. BTW
I am new to iBatis, and I got it talking to a legacy db. I also setup
relationships fairly easily. I did notice the typeHandler attribute of resultMap but this
is not documented in the dtd or user documents. |
