You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Nail Uenlue <na...@gmail.com> on 2009/07/30 11:25:05 UTC

- java.sql.SQLException: Fail to convert to internal representation: ch.xxx.converter.bean.KeywordItem - Problem

Hi everyone,

Im having an issue while trying to submit an Array of Objects to an
Oracle Stored procedure.

The map file looks like:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Converter">
 <typeAlias alias="keywordItems"
type="ch.generali.converter.bean.KeywordItem" />


       <resultMap id="keywordsResult"
class="ch.generali.converter.bean.KeywordItem">
       <result property="key" jdbcType="VARCHAR"
javaType="java.lang.String" column="KEY"/>
       <result property="value" jdbcType="VARCHAR"
javaType="java.lang.String" column="VALUE"/>
	</resultMap>
	
<parameterMap id="getKeywordParam" class="ch.generali.converter.bean.Keyword">
    <parameter property="keywords"
typeHandler="ch.generali.converter.dao.KeywordTypeHandlerCallback"
javaType="java.util.List" jdbcType="VVEVER.KEYWORD_TAB"
typeName="VVEVER.KEYWORD_TAB"  mode="INOUT"  />
    <parameter property="language" jdbcType="NUMERIC" mode="IN"
javaType="java.lang.Integer" />
    <parameter property="vertragsnr" jdbcType="VARCHAR" mode="IN"
javaType="java.lang.String" />
</parameterMap>
	
	<procedure id="getKeyword" parameterMap="getKeywordParam">
	    {call vvever.pck_ev_textbaustein_liste.ip_get_textbaustein_liste(?,?,?,?)}
	</procedure>

</sqlMap>


my TypeHandlerCallback class looks like:



package ch.generali.converter.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbcp.PoolableConnection;

import oracle.jdbc.driver.OracleConnection;
import oracle.jdbc.internal.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;


import ch.generali.converter.bean.Keyword;
import ch.generali.converter.bean.KeywordItem;

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 KeywordTypeHandlerCallback implements TypeHandlerCallback {

	 static {
		 JdbcTypeRegistry.setType("VVEVER.KEYWORD_ITEM", OracleTypes.STRUCT);
                 JdbcTypeRegistry.setType("VVEVER.KEYWORD_TAB",
OracleTypes.ARRAY);
          }
	
	public Object getResult(ResultGetter getter) throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}

	public void setParameter(ParameterSetter setter, Object parameter)
			throws SQLException {
		
			
			Statement stmt = setter.getPreparedStatement();
			Connection conn = stmt.getConnection();
//			Map<String, String> parameterMap = (HashMap<String, String>)parameter;

			  List<KeywordItem> keywordItems = (List<KeywordItem>) parameter;
			  KeywordItem[] keywordArray = new KeywordItem[keywordItems.size()];

			
			
	            for (int i = 0; i < keywordArray.length; i++) {
	            	keywordArray[i] = keywordItems.get(i);
	            }

			
			PoolableConnection pc = (PoolableConnection)conn;
			OracleConnection oc = (OracleConnection)pc.getDelegate();

			Map map = oc.getTypeMap();
			
			map.put("VVEVER.KEYWORD_ITEM",KeywordItem.class);


			
			ArrayDescriptor desc =
ArrayDescriptor.createDescriptor("VVEVER.KEYWORD_TAB", oc);
		
this is where it fails -->	ARRAY array = new ARRAY(desc, oc,keywordArray);
		

			setter.setArray(array);

	}

	public Object valueOf(String s) {
		// TODO Auto-generated method stub
		return null;
	}

}

The KeywordItem looks like:

public class KeywordItem {
	public String key;
	public String value;
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}

}


And the Object type in Oracle like:

CREATE type keyword_item
 AS
   object (
     key VARCHAR2(20) ,
    value VARCHAR2(1000) );
/

create or replace type keyword_tab as table of keyword_item;




What could cause this behavour?

---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscribe@ibatis.apache.org
For additional commands, e-mail: user-java-help@ibatis.apache.org