You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ibatis.apache.org by "Ashwin (JIRA)" <ib...@incubator.apache.org> on 2006/04/04 08:39:47 UTC
[jira] Created: (IBATIS-283) Oracle Objects support in iBatis using
TypeHandler
Oracle Objects support in iBatis using TypeHandler
--------------------------------------------------
Key: IBATIS-283
URL: http://issues.apache.org/jira/browse/IBATIS-283
Project: iBatis for Java
Type: Improvement
Components: SQL Maps
Environment: JBoss, Oracle 9i
Reporter: Ashwin
Priority: Blocker
We have our legacy database in oracle and the front end of the application was Oracle forms. Now we wish to change the front end to J2EE. We are using Spring as service layer that will call iBatis for data exchange.
Now, this legacy database has lots of stored procedures in which some of them returning oracle objects. We tried getting Oracle objects but I guess they are not supported by iBatis. We tried using TypeHandlerCallback using example from following URL: http://issues.apache.org/jira/browse/IBATIS-145 . We are new to iBatis so please help us with an example or a method to get oracle objects.
Sending you the code snip lets.
Main.java
SqlMapClient sqlMap;
resource = "SqlMapConfig.xml";
reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
Map map = new HashMap();
map.put("msnId","555");
sqlMap.queryForObject("storedFunc", map);
List firstList = (List)map.get("output1");
Iterator itr = firstList.iterator();
while(itr.hasNext()) {
VehicleModel vm = (VehicleModel)itr.next();
}
SqlMapConfig.xml
<sqlMapConfig>
<settings cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true" maxRequests="32"
maxSessions="10" maxTransactions="5"
useStatementNamespaces="false" />
<typeAlias alias="vehicle2Typehandler" type="Vehicle2Typehandler" />
<typeHandler javaType="VehicleModel" callback="vehicle2Typehandler" />
<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@10.0.4.20:1521:rajeshm"/>
<property name="JDBC.Username" value="system"/>
<property name="JDBC.Password" value="manager"/>
</dataSource>
</transactionManager>
<sqlMap resource="SQLMap.xml" />
</sqlMapConfig>
SQLMap.xml
<!-- Calling the Function -->
<parameterMap id="funcInput" class="map" >
<parameter property="output1" jdbcType="VEHICLE2" typeName="VEHICLE2" typeHandler="Vehicle2Typehandler" mode="OUT"/>
<parameter property="msnId" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
</parameterMap>
<procedure id="storedFunc" parameterMap="funcInput">
{? = call FUNC(?)}
</procedure>
Vehicle2Typehandler.java
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.StructDescriptor;
import oracle.sql.STRUCT;
import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;
public class Vehicle2Typehandler implements TypeHandlerCallback
{
static{
JdbcTypeRegistry.setType("VEHICLE2", Types.STRUCT);
};
public void setParameter(ParameterSetter setter, Object parameter)
throws SQLException {
VehicleModel vehicleModel[] = (VehicleModel[])parameter;
setter.getPreparedStatement().getConnection();
Connection conn = setter.getPreparedStatement().getConnection();
StructDescriptor structDescriptor = StructDescriptor.createDescriptor("VEHICLE2", conn);
STRUCT valStruct;
try {
valStruct = new STRUCT(structDescriptor, conn, vehicleModel);
} catch (SQLException e) {
throw e;
}
setter.setObject(valStruct);
}
public Object getResult(ResultGetter getter) throws SQLException {
//Array arr = getter.getArray();
VehicleModel vm[] = (VehicleModel[])getter.getObject();
if(vm==null)
return null;
else
//return (String[])arr.getArray();
return vm;
}
public Object valueOf(String arg0) {
String[] r = new String[1];
r[0] = arg0;
return r;
}
}
If you notice I have modified the Vehicle2Typehandler.java class from handling ARRAY type to STRUCT type.
Not sure weather it's the right approach. Getting the following error.
Exception in thread "main" com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in SQLMap.xml.
--- The error occurred while applying a parameter map.
--- Check the funcInput.
--- Check the output parameters (retrieval of output parameters failed).
--- Cause: java.lang.ClassCastException: oracle.sql.STRUCT
Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
at Main.main(Main.java:31)
Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
... 6 more
Caused by:
java.lang.ClassCastException: oracle.sql.STRUCT
at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
at Main.main(Main.java:31)
Any Help is appreciated !!!!!!!!!!!!!
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
Re: [jira] Created: (IBATIS-283) Oracle Objects support in iBatis using TypeHandler
Posted by Larry Meadors <lm...@apache.org>.
What is the type of the the object returned by getter.getObject()?
You can log that or use a debugger to see that.
Larry
On 4/4/06, Ashwin (JIRA) <ib...@incubator.apache.org> wrote:
> Oracle Objects support in iBatis using TypeHandler
> --------------------------------------------------
>
> Key: IBATIS-283
> URL: http://issues.apache.org/jira/browse/IBATIS-283
> Project: iBatis for Java
> Type: Improvement
>
> Components: SQL Maps
> Environment: JBoss, Oracle 9i
> Reporter: Ashwin
> Priority: Blocker
>
>
> We have our legacy database in oracle and the front end of the application was Oracle forms. Now we wish to change the front end to J2EE. We are using Spring as service layer that will call iBatis for data exchange.
>
> Now, this legacy database has lots of stored procedures in which some of them returning oracle objects. We tried getting Oracle objects but I guess they are not supported by iBatis. We tried using TypeHandlerCallback using example from following URL: http://issues.apache.org/jira/browse/IBATIS-145 . We are new to iBatis so please help us with an example or a method to get oracle objects.
>
> Sending you the code snip lets.
>
> Main.java
> SqlMapClient sqlMap;
>
> resource = "SqlMapConfig.xml";
>
> reader = Resources.getResourceAsReader(resource);
> sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
> Map map = new HashMap();
> map.put("msnId","555");
> sqlMap.queryForObject("storedFunc", map);
> List firstList = (List)map.get("output1");
> Iterator itr = firstList.iterator();
> while(itr.hasNext()) {
> VehicleModel vm = (VehicleModel)itr.next();
> }
>
> SqlMapConfig.xml
>
> <sqlMapConfig>
> <settings cacheModelsEnabled="true"
> enhancementEnabled="true"
> lazyLoadingEnabled="true" maxRequests="32"
> maxSessions="10" maxTransactions="5"
> useStatementNamespaces="false" />
> <typeAlias alias="vehicle2Typehandler" type="Vehicle2Typehandler" />
> <typeHandler javaType="VehicleModel" callback="vehicle2Typehandler" />
>
> <transactionManager type="JDBC" >
> <dataSource type="SIMPLE">
> <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
> <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@10.0.4.20:1521:rajeshm"/>
> <property name="JDBC.Username" value="system"/>
> <property name="JDBC.Password" value="manager"/>
> </dataSource>
> </transactionManager>
> <sqlMap resource="SQLMap.xml" />
> </sqlMapConfig>
>
> SQLMap.xml
>
> <!-- Calling the Function -->
> <parameterMap id="funcInput" class="map" >
> <parameter property="output1" jdbcType="VEHICLE2" typeName="VEHICLE2" typeHandler="Vehicle2Typehandler" mode="OUT"/>
> <parameter property="msnId" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
> </parameterMap>
>
> <procedure id="storedFunc" parameterMap="funcInput">
> {? = call FUNC(?)}
> </procedure>
>
>
>
> Vehicle2Typehandler.java
>
> import java.sql.Connection;
> import java.sql.SQLException;
> import java.sql.Types;
> import oracle.sql.ARRAY;
> import oracle.sql.ArrayDescriptor;
> import oracle.sql.StructDescriptor;
> import oracle.sql.STRUCT;
> import com.ibatis.sqlmap.client.extensions.ParameterSetter;
> import com.ibatis.sqlmap.client.extensions.ResultGetter;
> import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
> import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;
>
> public class Vehicle2Typehandler implements TypeHandlerCallback
> {
> static{
> JdbcTypeRegistry.setType("VEHICLE2", Types.STRUCT);
> };
>
> public void setParameter(ParameterSetter setter, Object parameter)
> throws SQLException {
> VehicleModel vehicleModel[] = (VehicleModel[])parameter;
> setter.getPreparedStatement().getConnection();
> Connection conn = setter.getPreparedStatement().getConnection();
>
> StructDescriptor structDescriptor = StructDescriptor.createDescriptor("VEHICLE2", conn);
> STRUCT valStruct;
> try {
> valStruct = new STRUCT(structDescriptor, conn, vehicleModel);
> } catch (SQLException e) {
>
> throw e;
> }
> setter.setObject(valStruct);
> }
>
> public Object getResult(ResultGetter getter) throws SQLException {
> //Array arr = getter.getArray();
> VehicleModel vm[] = (VehicleModel[])getter.getObject();
> if(vm==null)
> return null;
> else
> //return (String[])arr.getArray();
> return vm;
> }
>
>
> public Object valueOf(String arg0) {
> String[] r = new String[1];
> r[0] = arg0;
> return r;
> }
> }
>
>
> If you notice I have modified the Vehicle2Typehandler.java class from handling ARRAY type to STRUCT type.
> Not sure weather it's the right approach. Getting the following error.
>
>
> Exception in thread "main" com.ibatis.common.jdbc.exception.NestedSQLException:
>
> --- The error occurred in SQLMap.xml.
>
> --- The error occurred while applying a parameter map.
>
> --- Check the funcInput.
>
> --- Check the output parameters (retrieval of output parameters failed).
>
> --- Cause: java.lang.ClassCastException: oracle.sql.STRUCT
>
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
>
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
>
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
>
> at Main.main(Main.java:31)
>
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
>
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
>
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
>
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
>
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
>
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
>
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
>
> ... 6 more
>
>
>
> Caused by:
>
> java.lang.ClassCastException: oracle.sql.STRUCT
>
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
>
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
>
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
>
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
>
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
>
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
>
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
>
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
>
> at Main.main(Main.java:31)
>
> Any Help is appreciated !!!!!!!!!!!!!
>
>
> --
> This message is automatically generated by JIRA.
> -
> If you think it was sent incorrectly contact one of the administrators:
> http://issues.apache.org/jira/secure/Administrators.jspa
> -
> For more information on JIRA, see:
> http://www.atlassian.com/software/jira
>
>
[jira] Closed: (IBATIS-283) Oracle Objects support in iBatis using
TypeHandler
Posted by "Brandon Goodin (JIRA)" <ib...@incubator.apache.org>.
[ http://issues.apache.org/jira/browse/IBATIS-283?page=all ]
Brandon Goodin closed IBATIS-283:
---------------------------------
Resolution: Fixed
I agree with Jeff... this should be moved over to the user list if more help is needed.
> Oracle Objects support in iBatis using TypeHandler
> --------------------------------------------------
>
> Key: IBATIS-283
> URL: http://issues.apache.org/jira/browse/IBATIS-283
> Project: iBatis for Java
> Type: Improvement
> Components: SQL Maps
> Environment: JBoss, Oracle 9i
> Reporter: Ashwin
> Priority: Blocker
>
> We have our legacy database in oracle and the front end of the application was Oracle forms. Now we wish to change the front end to J2EE. We are using Spring as service layer that will call iBatis for data exchange.
> Now, this legacy database has lots of stored procedures in which some of them returning oracle objects. We tried getting Oracle objects but I guess they are not supported by iBatis. We tried using TypeHandlerCallback using example from following URL: http://issues.apache.org/jira/browse/IBATIS-145 . We are new to iBatis so please help us with an example or a method to get oracle objects.
> Sending you the code snip lets.
> Main.java
> SqlMapClient sqlMap;
> resource = "SqlMapConfig.xml";
> reader = Resources.getResourceAsReader(resource);
> sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
> Map map = new HashMap();
> map.put("msnId","555");
> sqlMap.queryForObject("storedFunc", map);
> List firstList = (List)map.get("output1");
> Iterator itr = firstList.iterator();
> while(itr.hasNext()) {
> VehicleModel vm = (VehicleModel)itr.next();
> }
>
> SqlMapConfig.xml
> <sqlMapConfig>
> <settings cacheModelsEnabled="true"
> enhancementEnabled="true"
> lazyLoadingEnabled="true" maxRequests="32"
> maxSessions="10" maxTransactions="5"
> useStatementNamespaces="false" />
> <typeAlias alias="vehicle2Typehandler" type="Vehicle2Typehandler" />
> <typeHandler javaType="VehicleModel" callback="vehicle2Typehandler" />
> <transactionManager type="JDBC" >
> <dataSource type="SIMPLE">
> <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
> <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@10.0.4.20:1521:rajeshm"/>
> <property name="JDBC.Username" value="system"/>
> <property name="JDBC.Password" value="manager"/>
> </dataSource>
> </transactionManager>
> <sqlMap resource="SQLMap.xml" />
> </sqlMapConfig>
> SQLMap.xml
> <!-- Calling the Function -->
> <parameterMap id="funcInput" class="map" >
> <parameter property="output1" jdbcType="VEHICLE2" typeName="VEHICLE2" typeHandler="Vehicle2Typehandler" mode="OUT"/>
> <parameter property="msnId" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
> </parameterMap>
> <procedure id="storedFunc" parameterMap="funcInput">
> {? = call FUNC(?)}
> </procedure>
>
> Vehicle2Typehandler.java
> import java.sql.Connection;
> import java.sql.SQLException;
> import java.sql.Types;
> import oracle.sql.ARRAY;
> import oracle.sql.ArrayDescriptor;
> import oracle.sql.StructDescriptor;
> import oracle.sql.STRUCT;
> import com.ibatis.sqlmap.client.extensions.ParameterSetter;
> import com.ibatis.sqlmap.client.extensions.ResultGetter;
> import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
> import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;
> public class Vehicle2Typehandler implements TypeHandlerCallback
> {
> static{
> JdbcTypeRegistry.setType("VEHICLE2", Types.STRUCT);
> };
>
> public void setParameter(ParameterSetter setter, Object parameter)
> throws SQLException {
> VehicleModel vehicleModel[] = (VehicleModel[])parameter;
> setter.getPreparedStatement().getConnection();
> Connection conn = setter.getPreparedStatement().getConnection();
> StructDescriptor structDescriptor = StructDescriptor.createDescriptor("VEHICLE2", conn);
> STRUCT valStruct;
> try {
> valStruct = new STRUCT(structDescriptor, conn, vehicleModel);
> } catch (SQLException e) {
> throw e;
> }
> setter.setObject(valStruct);
> }
> public Object getResult(ResultGetter getter) throws SQLException {
> //Array arr = getter.getArray();
> VehicleModel vm[] = (VehicleModel[])getter.getObject();
> if(vm==null)
> return null;
> else
> //return (String[])arr.getArray();
> return vm;
> }
> public Object valueOf(String arg0) {
> String[] r = new String[1];
> r[0] = arg0;
> return r;
> }
> }
> If you notice I have modified the Vehicle2Typehandler.java class from handling ARRAY type to STRUCT type.
> Not sure weather it's the right approach. Getting the following error.
>
> Exception in thread "main" com.ibatis.common.jdbc.exception.NestedSQLException:
> --- The error occurred in SQLMap.xml.
> --- The error occurred while applying a parameter map.
> --- Check the funcInput.
> --- Check the output parameters (retrieval of output parameters failed).
> --- Cause: java.lang.ClassCastException: oracle.sql.STRUCT
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
> at Main.main(Main.java:31)
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
> ... 6 more
>
> Caused by:
> java.lang.ClassCastException: oracle.sql.STRUCT
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
> at Main.main(Main.java:31)
> Any Help is appreciated !!!!!!!!!!!!!
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
[jira] Commented: (IBATIS-283) Oracle Objects support in iBatis
using TypeHandler
Posted by "Jeff Butler (JIRA)" <ib...@incubator.apache.org>.
[ http://issues.apache.org/jira/browse/IBATIS-283?page=comments#action_12416083 ]
Jeff Butler commented on IBATIS-283:
------------------------------------
This does not look like a bug report to me - rather it is a request for help. Please use the mailing list for help.
IBATIS-145 and IBATIS-242 both deal with this issue and provide examples. Both are apparantly fixed in SVN.
Until the next release, you may need to build iBATIS from source to make a TypeHandler work as you need it to.
I'll close this as "invalid" unless you can provide more information that indicates a new bug in iBATIS.
> Oracle Objects support in iBatis using TypeHandler
> --------------------------------------------------
>
> Key: IBATIS-283
> URL: http://issues.apache.org/jira/browse/IBATIS-283
> Project: iBatis for Java
> Type: Improvement
> Components: SQL Maps
> Environment: JBoss, Oracle 9i
> Reporter: Ashwin
> Priority: Blocker
>
> We have our legacy database in oracle and the front end of the application was Oracle forms. Now we wish to change the front end to J2EE. We are using Spring as service layer that will call iBatis for data exchange.
> Now, this legacy database has lots of stored procedures in which some of them returning oracle objects. We tried getting Oracle objects but I guess they are not supported by iBatis. We tried using TypeHandlerCallback using example from following URL: http://issues.apache.org/jira/browse/IBATIS-145 . We are new to iBatis so please help us with an example or a method to get oracle objects.
> Sending you the code snip lets.
> Main.java
> SqlMapClient sqlMap;
> resource = "SqlMapConfig.xml";
> reader = Resources.getResourceAsReader(resource);
> sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
> Map map = new HashMap();
> map.put("msnId","555");
> sqlMap.queryForObject("storedFunc", map);
> List firstList = (List)map.get("output1");
> Iterator itr = firstList.iterator();
> while(itr.hasNext()) {
> VehicleModel vm = (VehicleModel)itr.next();
> }
>
> SqlMapConfig.xml
> <sqlMapConfig>
> <settings cacheModelsEnabled="true"
> enhancementEnabled="true"
> lazyLoadingEnabled="true" maxRequests="32"
> maxSessions="10" maxTransactions="5"
> useStatementNamespaces="false" />
> <typeAlias alias="vehicle2Typehandler" type="Vehicle2Typehandler" />
> <typeHandler javaType="VehicleModel" callback="vehicle2Typehandler" />
> <transactionManager type="JDBC" >
> <dataSource type="SIMPLE">
> <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
> <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@10.0.4.20:1521:rajeshm"/>
> <property name="JDBC.Username" value="system"/>
> <property name="JDBC.Password" value="manager"/>
> </dataSource>
> </transactionManager>
> <sqlMap resource="SQLMap.xml" />
> </sqlMapConfig>
> SQLMap.xml
> <!-- Calling the Function -->
> <parameterMap id="funcInput" class="map" >
> <parameter property="output1" jdbcType="VEHICLE2" typeName="VEHICLE2" typeHandler="Vehicle2Typehandler" mode="OUT"/>
> <parameter property="msnId" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
> </parameterMap>
> <procedure id="storedFunc" parameterMap="funcInput">
> {? = call FUNC(?)}
> </procedure>
>
> Vehicle2Typehandler.java
> import java.sql.Connection;
> import java.sql.SQLException;
> import java.sql.Types;
> import oracle.sql.ARRAY;
> import oracle.sql.ArrayDescriptor;
> import oracle.sql.StructDescriptor;
> import oracle.sql.STRUCT;
> import com.ibatis.sqlmap.client.extensions.ParameterSetter;
> import com.ibatis.sqlmap.client.extensions.ResultGetter;
> import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
> import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;
> public class Vehicle2Typehandler implements TypeHandlerCallback
> {
> static{
> JdbcTypeRegistry.setType("VEHICLE2", Types.STRUCT);
> };
>
> public void setParameter(ParameterSetter setter, Object parameter)
> throws SQLException {
> VehicleModel vehicleModel[] = (VehicleModel[])parameter;
> setter.getPreparedStatement().getConnection();
> Connection conn = setter.getPreparedStatement().getConnection();
> StructDescriptor structDescriptor = StructDescriptor.createDescriptor("VEHICLE2", conn);
> STRUCT valStruct;
> try {
> valStruct = new STRUCT(structDescriptor, conn, vehicleModel);
> } catch (SQLException e) {
> throw e;
> }
> setter.setObject(valStruct);
> }
> public Object getResult(ResultGetter getter) throws SQLException {
> //Array arr = getter.getArray();
> VehicleModel vm[] = (VehicleModel[])getter.getObject();
> if(vm==null)
> return null;
> else
> //return (String[])arr.getArray();
> return vm;
> }
> public Object valueOf(String arg0) {
> String[] r = new String[1];
> r[0] = arg0;
> return r;
> }
> }
> If you notice I have modified the Vehicle2Typehandler.java class from handling ARRAY type to STRUCT type.
> Not sure weather it's the right approach. Getting the following error.
>
> Exception in thread "main" com.ibatis.common.jdbc.exception.NestedSQLException:
> --- The error occurred in SQLMap.xml.
> --- The error occurred while applying a parameter map.
> --- Check the funcInput.
> --- Check the output parameters (retrieval of output parameters failed).
> --- Cause: java.lang.ClassCastException: oracle.sql.STRUCT
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
> at Main.main(Main.java:31)
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
> ... 6 more
>
> Caused by:
> java.lang.ClassCastException: oracle.sql.STRUCT
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
> at Main.main(Main.java:31)
> Any Help is appreciated !!!!!!!!!!!!!
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
[jira] Closed: (IBATIS-283) Oracle Objects support in iBatis using
TypeHandler
Posted by "Brandon Goodin (JIRA)" <ib...@incubator.apache.org>.
[ http://issues.apache.org/jira/browse/IBATIS-283?page=all ]
Brandon Goodin closed IBATIS-283:
---------------------------------
Resolution: Invalid
This may be a valid issue for the individual. But, not for iBATIS. This needs to be moved to the iBATIS user list if it is still a problem.
> Oracle Objects support in iBatis using TypeHandler
> --------------------------------------------------
>
> Key: IBATIS-283
> URL: http://issues.apache.org/jira/browse/IBATIS-283
> Project: iBatis for Java
> Type: Improvement
> Components: SQL Maps
> Environment: JBoss, Oracle 9i
> Reporter: Ashwin
> Assignee: Brandon Goodin
> Priority: Blocker
>
> We have our legacy database in oracle and the front end of the application was Oracle forms. Now we wish to change the front end to J2EE. We are using Spring as service layer that will call iBatis for data exchange.
> Now, this legacy database has lots of stored procedures in which some of them returning oracle objects. We tried getting Oracle objects but I guess they are not supported by iBatis. We tried using TypeHandlerCallback using example from following URL: http://issues.apache.org/jira/browse/IBATIS-145 . We are new to iBatis so please help us with an example or a method to get oracle objects.
> Sending you the code snip lets.
> Main.java
> SqlMapClient sqlMap;
> resource = "SqlMapConfig.xml";
> reader = Resources.getResourceAsReader(resource);
> sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
> Map map = new HashMap();
> map.put("msnId","555");
> sqlMap.queryForObject("storedFunc", map);
> List firstList = (List)map.get("output1");
> Iterator itr = firstList.iterator();
> while(itr.hasNext()) {
> VehicleModel vm = (VehicleModel)itr.next();
> }
>
> SqlMapConfig.xml
> <sqlMapConfig>
> <settings cacheModelsEnabled="true"
> enhancementEnabled="true"
> lazyLoadingEnabled="true" maxRequests="32"
> maxSessions="10" maxTransactions="5"
> useStatementNamespaces="false" />
> <typeAlias alias="vehicle2Typehandler" type="Vehicle2Typehandler" />
> <typeHandler javaType="VehicleModel" callback="vehicle2Typehandler" />
> <transactionManager type="JDBC" >
> <dataSource type="SIMPLE">
> <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
> <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@10.0.4.20:1521:rajeshm"/>
> <property name="JDBC.Username" value="system"/>
> <property name="JDBC.Password" value="manager"/>
> </dataSource>
> </transactionManager>
> <sqlMap resource="SQLMap.xml" />
> </sqlMapConfig>
> SQLMap.xml
> <!-- Calling the Function -->
> <parameterMap id="funcInput" class="map" >
> <parameter property="output1" jdbcType="VEHICLE2" typeName="VEHICLE2" typeHandler="Vehicle2Typehandler" mode="OUT"/>
> <parameter property="msnId" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
> </parameterMap>
> <procedure id="storedFunc" parameterMap="funcInput">
> {? = call FUNC(?)}
> </procedure>
>
> Vehicle2Typehandler.java
> import java.sql.Connection;
> import java.sql.SQLException;
> import java.sql.Types;
> import oracle.sql.ARRAY;
> import oracle.sql.ArrayDescriptor;
> import oracle.sql.StructDescriptor;
> import oracle.sql.STRUCT;
> import com.ibatis.sqlmap.client.extensions.ParameterSetter;
> import com.ibatis.sqlmap.client.extensions.ResultGetter;
> import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
> import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;
> public class Vehicle2Typehandler implements TypeHandlerCallback
> {
> static{
> JdbcTypeRegistry.setType("VEHICLE2", Types.STRUCT);
> };
>
> public void setParameter(ParameterSetter setter, Object parameter)
> throws SQLException {
> VehicleModel vehicleModel[] = (VehicleModel[])parameter;
> setter.getPreparedStatement().getConnection();
> Connection conn = setter.getPreparedStatement().getConnection();
> StructDescriptor structDescriptor = StructDescriptor.createDescriptor("VEHICLE2", conn);
> STRUCT valStruct;
> try {
> valStruct = new STRUCT(structDescriptor, conn, vehicleModel);
> } catch (SQLException e) {
> throw e;
> }
> setter.setObject(valStruct);
> }
> public Object getResult(ResultGetter getter) throws SQLException {
> //Array arr = getter.getArray();
> VehicleModel vm[] = (VehicleModel[])getter.getObject();
> if(vm==null)
> return null;
> else
> //return (String[])arr.getArray();
> return vm;
> }
> public Object valueOf(String arg0) {
> String[] r = new String[1];
> r[0] = arg0;
> return r;
> }
> }
> If you notice I have modified the Vehicle2Typehandler.java class from handling ARRAY type to STRUCT type.
> Not sure weather it's the right approach. Getting the following error.
>
> Exception in thread "main" com.ibatis.common.jdbc.exception.NestedSQLException:
> --- The error occurred in SQLMap.xml.
> --- The error occurred while applying a parameter map.
> --- Check the funcInput.
> --- Check the output parameters (retrieval of output parameters failed).
> --- Cause: java.lang.ClassCastException: oracle.sql.STRUCT
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
> at Main.main(Main.java:31)
> Caused by: java.lang.ClassCastException: oracle.sql.STRUCT
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
> ... 6 more
>
> Caused by:
> java.lang.ClassCastException: oracle.sql.STRUCT
> at Vehicle2Typehandler.getResult(Vehicle2Typehandler.java:66)
> at com.ibatis.sqlmap.engine.type.CustomTypeHandler.getResult(CustomTypeHandler.java:64)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:357)
> at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:305)
> at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
> at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
> at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
> at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
> at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
> at Main.main(Main.java:31)
> Any Help is appreciated !!!!!!!!!!!!!
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira