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.