Сабж собственно.
При получение строковой коллекции из оракла, колличество элементов возращается правильно.
А вместо значений ???
Если вместо строкой коллекции возращать коллекцию чисел то все работает.
Оракловая часть
1.
CREATE OR REPLACE TYPE "ARRAY_STRING" IS TABLE OF VARCHAR2(4000);
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
Connected as mumytroll@mumytroll_oracle
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
SQL> select * from nls_session_parameters
2 /
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE RUSSIAN
NLS_TERRITORY CIS
NLS_CURRENCY р.
NLS_ISO_CURRENCY CIS
NLS_NUMERIC_CHARACTERS ,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD.MM.RR
NLS_DATE_LANGUAGE RUSSIAN
NLS_SORT RUSSIAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY р.
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
17 rows selected
SQL>
Мапер
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.SampleMapper">
<update id="getArrayString" statementType="CALLABLE" parameterType="java.util.Map" >
<![CDATA[
declare
v ARRAY_STRING := ARRAY_STRING();
begin
v.extend(1);
v(v.Last()) := 'Param1';
v.extend(1);
v(v.Last()) := 'Param2';
v.extend(1);
v(v.Last()) := 'Param3';
v.extend(1);
v(v.Last()) := 'Param4';
#{map.result, jdbcType=ARRAY, javaType=OBJECT, jdbcTypeName=ARRAY_STRING, typeHandler=sample.SampleHandler, mode=OUT} := v;
end;
]]>
</update>
</mapper>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
package sample;
import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.*;
public class SampleHandler implements TypeHandler {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
// Сюда не заходим даже.
}
@Override
public Object getResult(ResultSet resultSet, String s) throws SQLException {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public Object getResult(ResultSet resultSet, int i) throws SQLException {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public Object getResult(CallableStatement callableStatement, int i) throws SQLException {
Object z = callableStatement.getObject(i);
ARRAY b = (ARRAY) z;
Object[] x = (Object[]) b.getArray();
for (Object o : x) {
// Выводим что нам прилетело.
System.out.println("==>" + o.toString() + " " + o.getClass().getName());
}
return x;
}
}
Интерфес
1.
2.
3.
4.
5.
6.
7.
8.
9.
package sample;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
public interface SampleMapper {
public void getArrayString(@Param("map") Map<String, Object> map);
}
Код для вызова
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
package sample;
import oracle.sql.ARRAY;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertNotNull;
@RunWith(SpringJUnit4ClassRunner.class)
public class SampleMapperTest extends AbstractMapperTest {
@Autowired
SampleMapper sampleMapper;
@Test
public void testGetArrayString() throws Exception {
Map<String, Object> param = new HashMap<String, Object>();
SampleMapper.getArrayString(param);
assertNotNull("Должны получить значение", param.get("result"));
}
}
В результатет получаем
==>??? java.lang.String
==>??? java.lang.String
==>??? java.lang.String
==>??? java.lang.String
- Дай нам хлеба!
- Эй, булочная за углом (с)