You could also define a global type handler if you wanted every instance of
com.foo.UserTypeEnum to be handled with the same type handler.

Jeff Butler



On 2/6/07, Dave Rodenbaugh <[EMAIL PROTECTED]> wrote:

Hmmm...ok, found the source of my problem.

You can't seem to do this with resultClass="...".  You must explicitly
define a resultMap, reference the resultMap instead of resultClass from
the <select>, set the property on the resultMap to use the type handler,
and then it works.

FYI,
-D

-----Original Message-----
From: Dave Rodenbaugh
Sent: Monday, February 05, 2007 4:59 PM
To: user-java@ibatis.apache.org
Subject: Using a Type Handler for SELECT stmt

Hi everyone,

I have a custom type handler I'm using for Java 1.5 enums to map to a
VARCHAR column in Oracle.  I've read the SqlMap doc about TypeHandlers
but there are some missing details...I'm sure my TypeHandler syntax
definition is off, but I'm having a hard time finding the right place
for it.

If I want to setup my sql-map.xml like this (to pull the enums for a
select), is this the right XML?  (the examples are all INSERT/stored
proc-based, so the syntax here isn't clear):

   <typeAlias alias='User' type='com.foo.UserVO'/>
   <!-- SQL fragment to be referenced by other selects -->
   <sql id='UserBase'>
       SELECT
           USER_ID AS userId,
           USER_TYPE_ID AS userTypeId,
           USER_TYPE AS
userType#userType,javaType=com.foo.UserTypeEnum,jdbcType=VARCHAR,handler
=com.foo.UserTypeTypeHandlerCallback#,
           SALES_AGENT_ID AS salesAgentId,
           USERNAME AS username,
           PASSWORD AS password,
           START_DATE AS startDate,
           END_DATE AS endDate,
           FIRST_NAME AS firstName,
           LAST_NAME AS lastName,
           CYG_SALES_ID AS cygSalesId,
           CREATE_DATE AS createDate,
           UPDATE_DATE AS updateDate,
           CREATED_BY AS createdBy,
           UPDATED_BY AS updatedBy
       FROM OWNER.USER_VW
   </sql>
   <select id='findUser' resultClass='User'>
       <include refid='UserBase'/>
   </select>
   <select id='findUserByUserId' parameterClass='java.lang.Long'
resultClass='User'><include refid='UserBase'/>WHERE User_ID =
#userId#</select>

Where UserVO has an Enum for the field/property UserType, the enum is
well-defined, and my callback handler looks like this:

public class UserTypeTypeHandlerCallback implements TypeHandlerCallback
{
   public Object getResult(ResultGetter getter) throws SQLException
   {
       //Convert the result to the Enum class
       String s = getter.getString();
       if (null == s) return null;
       try {
           return Enum.valueOf(UserTypeEnum.class, s);
       } catch (IllegalArgumentException e) {
           throw new SQLException("Invalid enum value encountered: " +
s + " for " + UserTypeEnum.class);
       }
   }

   public void setParameter(ParameterSetter setter, Object param)
throws SQLException
   {
       //Convert the Enum to the DB result
       UserTypeEnum e = null;
       if (param.getClass() == String.class) {
           e = (UserTypeEnum)param;
       } else if (param.getClass() == Long.class) {
           e = UserTypeEnum.valueOf((Long)param);
       }
       setter.setString(e.name());
   }

   public Object valueOf(String str)
   {
       //Convert the result to the Enum class
       if (null == str) return null;
       return Enum.valueOf(UserTypeEnum.class, str);
   }
}

Why do I see an Oracle error for this query:

com.ibatis.dao.client.DaoException: Failed to queryForList - id
[findWbUserByUserId], parameterObject [1].  Cause:
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in
com/wildblue/serviceimage/ibatis-view-sql-maps.xml.
--- The error occurred while applying a parameter map.
--- Check the findWbUserByUserId-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: java.sql.SQLException: ORA-00923: FROM keyword not found
where expected

Caused by: java.sql.SQLException: ORA-00923: FROM keyword not found
where expected

       at
com.ibatis.dao.client.template.SqlMapDaoTemplate.queryForList(SqlMapDaoT
emplate.java:284)
       at
com.wildblue.serviceimage.WbUserDaoImpl.findWbUserByUserId(WbUserDaoImpl
.java:41)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
       at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at com.ibatis.dao.engine.impl.DaoProxy.invoke(DaoProxy.java:72)
       at $Proxy15.findWbUserByUserId(Unknown Source)
       at
com.wildblue.serviceimage.ServiceImageService.getUser(ServiceImageServic
e.java:177)
       at
com.wildblue.serviceimage.ServiceImageService.insertAccount(ServiceImage
Service.java:655)
       at
com.wildblue.serviceimage.ServiceImageService.persistAccount(ServiceImag
eService.java:241)
       at
com.wildblue.serviceimage.ServiceImageServiceTest.testPaymentMethod(Serv
iceImageServiceTest.java:45)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
       at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at junit.framework.TestCase.runTest(TestCase.java:154)
       at junit.framework.TestCase.runBare(TestCase.java:127)
       at junit.framework.TestResult$1.protect(TestResult.java:106)
       at junit.framework.TestResult.runProtected(TestResult.java:124)
       at junit.framework.TestResult.run(TestResult.java:109)
       at junit.framework.TestCase.run(TestCase.java:118)
       at
org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUn
it3TestReference.java:128)
       at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.ja
va:38)
       at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:460)
       at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:673)
       at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun
ner.java:386)
       at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu
nner.java:196)
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in
com/wildblue/serviceimage/ibatis-view-sql-maps.xml.
--- The error occurred while applying a parameter map.
--- Check the findWbUserByUserId-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: java.sql.SQLException: ORA-00923: FROM keyword not found
where expected

Caused by: java.sql.SQLException: ORA-00923: FROM keyword not found
where expected

       at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:185)
       at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForList(GeneralStatement.java:123)
       at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMap
ExecutorDelegate.java:614)
       at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMap
ExecutorDelegate.java:588)
       at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessi
onImpl.java:118)
       at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClient
Impl.java:96)
       at
com.ibatis.dao.client.template.SqlMapDaoTemplate.queryForList(SqlMapDaoT
emplate.java:282)
       ... 27 more
Caused by: java.sql.SQLException: ORA-00923: FROM keyword not found
where expected

       at
oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
       at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
       at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:582)
       at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1983)
       at
oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:877
)
       at
oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2
513)
       at
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.
java:2857)
       at
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedS
tatement.java:608)
       at
oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStateme
nt.java:684)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
       at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at
com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.invoke(Prepared
StatementLogProxy.java:62)
       at $Proxy17.execute(Unknown Source)
       at
com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.
java:182)
       at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQu
ery(GeneralStatement.java:205)
       at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:173)
       ... 33 more

Thanks...
-Dave



Reply via email to