ARRAY OF OBJECTS NOT RETRIEVED WHEN INOUT -----------------------------------------
Key: IBATIS-559 URL: https://issues.apache.org/jira/browse/IBATIS-559 Project: iBatis for Java Issue Type: Bug Affects Versions: 2.3.4 Environment: WIndows XP, JDeveloper 10.1.3.4.0, Java 5 update 16, Oracle 10g Reporter: John Eric Hamacher I am trying to get an INOUT parameter to return an array of objects but I just get an empty list. The procedure works fine using straight JDBC. All the other parameters work fine including the last parameter which returns a List of objects. I have seemingly tried everything to get this to work. So I am beginning to wonder if this is a bug. --Eric <sqlMapConfig> <settings cacheModelsEnabled="true" lazyLoadingEnabled="true" enhancementEnabled="true" maxSessions="64" maxTransactions="8" maxRequests="128"/> <typeHandler javaType="survey.dbobject.CodeRefObject" callback="ibatis.CodeRefArrayTypeHandlerCallback"/> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="oracle.jdbc.pool.OracleDataSource"/> <property name="JDBC.ConnectionURL" value="url"/> <property name="JDBC.Username" value="username"/> <property name="JDBC.Password" value="password"/> </dataSource> </transactionManager> <sqlMap resource="ibatis/ibatis.xml"/> </sqlMapConfig> <sqlMap namespace="CodeRef" > <parameterMap id="codeRefMap" class="map"> <parameter property="codeDomainName" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> <parameter property="codeNameValueObjectARRAY" jdbcType="ARRAY" typeName="NAME_VALUE_OBJ_TAB" typeHandler="ibatis.NameValueArrayTypeHandlerCallback" mode="IN"/> <parameter property="codeRefObjectARRAY" jdbcType="ARRAY" typeName="CODE_REF_OBJ_TAB" typeHandler="ibatis.CodeRefArrayTypeHandlerCallback" mode="INOUT"/> <parameter property="errorFlag" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/> <parameter property="errorARRAY" jdbcType="ARRAY" typeName="ERROR_OBJ_TAB" typeHandler="ibatis.ErrorArrayTypeHandlerCallback" mode="OUT"/> </parameterMap> <procedure id="storedInfo" parameterMap="codeRefMap"> {call glp_utilities.get_codeRef(?,?,?,?,?) } </procedure> </sqlMap> Main executing class: public class IbatisMain { public IbatisMain() { } public static void main(String[] args) { IbatisMain ibatisMain = new IbatisMain(); try { ibatisMain.perform(); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public void perform() throws IOException, SQLException { Reader reader = Resources.getResourceAsReader("sql-map-config.xml"); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); Map inputMap = new HashMap(); CodeRefObject[] croArray = new CodeRefObject[1]; CodeNameValueObject[] cnvoArray = new CodeNameValueObject[3]; //Create array of one empty CodeRefObject. croArray[0] = new CodeRefObject(); //Create array of CodeNameValueObjects which specify that standard //codes and countries (and not states) should be loaded. CodeNameValueObject cnvoCode = new CodeNameValueObject(); cnvoCode.setParm_name(CODE_REF_LOAD_STANDARD); cnvoCode.setParm_value("Y"); cnvoArray[0] = cnvoCode; CodeNameValueObject cnvoCountry = new CodeNameValueObject(); cnvoCountry.setParm_name(CODE_REF_LOAD_COUNTRY); cnvoCountry.setParm_value("Y"); cnvoArray[1] = cnvoCountry; CodeNameValueObject cnvoState = new CodeNameValueObject(); cnvoState.setParm_name(CODE_REF_LOAD_STATE_PROV); cnvoState.setParm_value("N"); cnvoArray[2] = cnvoState; inputMap.put("codeRefObjectARRAY", croArray); inputMap.put("codeNameValueObjectARRAY", cnvoArray); inputMap.put("codeDomainName", null); System.err.println("DDDDDDD" + inputMap.toString()); sqlMap.queryForList("storedInfo", inputMap); System.err.println("@@@@@@@ = " + inputMap.toString()); List codeRefOut = (List) inputMap.get("codeRefObjectARRAY"); String errorFlag = (String) inputMap.get("errorFlag"); List errors = (List) inputMap.get("errorARRAY"); for (Object o: codeRefOut) { CodeRefObject cro = (CodeRefObject) o; System.err.println(cro.toString()); } if (errorFlag.equalsIgnoreCase("Y")) { for (Object o: errors) { ErrorObject eo = (ErrorObject) o; System.err.println(eo.toString()); } } } CodeRefArrayTypeHandlerCallback: public class CodeRefArrayTypeHandlerCallback implements TypeHandlerCallback { static { JdbcTypeRegistry.setType("CODE_REF_OBJ_TAB", OracleTypes.ARRAY); } public void setParameter(ParameterSetter parameterSetter, Object object) throws SQLException { Connection conn = null; CodeRefObject[] codeRefObjects = (CodeRefObject[]) object; conn = parameterSetter.getPreparedStatement().getConnection(); ArrayDescriptor ad = ArrayDescriptor.createDescriptor("CODE_REF_OBJ_TAB", conn); ARRAY array = new ARRAY(ad, conn, codeRefObjects); parameterSetter.setArray(array); } public Object getResult(ResultGetter resultGetter) throws SQLException { Array array = resultGetter.getArray(); if (array == null) { return null; } else { List<CodeRefObject> croList = new ArrayList<CodeRefObject>(); Object[] objectArray = (Object[]) array.getArray(); for (Object o: objectArray) { System.err.println("ASASADD"); STRUCT struct = (STRUCT) o; Object[] attributes = (Object[])struct.getAttributes(); CodeRefObject cro = new CodeRefObject(); cro.saveAttributes(attributes); croList.add(cro); } return croList; } } public Object valueOf(String string) { String[] r = new String[1]; r[0] = string; return r; } } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.