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.

Reply via email to