2017-05-23 3 views
1

Oracle 사용자 정의 테이블 유형을 Java 오브젝트 목록으로 변환하기 위해 TypeHandler를 작성하는 데 어려움이 있습니다.사용자 정의 Oracle 테이블 유형에 대한 MyBatis3 TypeHandler 작성

은 데이터베이스 유형 및 기능의 사양은 다음과 같이 정의된다, 나는 쓰기를 시도하고 마지막으로

<resultMap id="myResultMap" type="GetMyStuffResult" /> 
<select id="getMyStuff" statementType="CALLABLE" parameterType="map"> 
    {#{return_value, mode=OUT, 
        typeHandler=MyStuffToList 
        jdbcTypeName=MySchema.MY_TYPE_TABLE, 
        jdbcType=ARRAY} = 
     call MySchema.MyPackage.GET_MY_STUFF (
       my_user_name => #{userName, mode=IN, jdbcType=VARCHAR} 
    )} 
</select> 

:

CREATE OR REPLACE TYPE MySchema.MY_TYPE IS OBJECT (
    first_name VARCHAR2(50), 
    last_name  VARCHAR2(50) 
); 

CREATE OR REPLACE TYPE MySchema.MY_TYPE_TBL IS TABLE OF MY_TYPE; 

FUNCTION GET_MY_STUFF(my_user_name IN VARCHAR2) RETURN MySchema.MY_TYPE_TABLE; 

내가 그것을에서 다음 호출이있는 MyBatis로 매퍼가 TypeHandler, getResult 오버라이드에서 비참하게 실패합니다.

public class MyStuffToList implements TypeHandler<List<GetMyStuffResult>> { 

    // Other Overrides Here 

    @Override 
    public List<GetMyStuffResult> getResult(CallableStatement cs, int columnIndex) 
    throws SQLException { 
     List<GetMyStuffResult> results = new ArrayList<GetMyStuffResult>(); 
     Array array = cs.getArray(columnIndex); 

     // HOW DO I CONVERT THE Array TO List<GetMyStuffResult> ??? 

     return results; 
    } 
} 

Can not 나는 TypeHandler에있는 CallableStatement에서 내가 원하는 목록으로 전달 된 것 같습니다.

답변

0

다음은이 작업을 수행 한 것입니다.

TypeHandler 필요 단일 오라클 유형 (안 테이블 형식)을 참조하는 타입 맵 생성하기 :

public class MyStuffToList implements TypeHandler<List<GetMyStuffResult>> { 

    // Other Overrides Here 

    @Override 
    public List<GetMyStuffResult> getResult(CallableStatement cs, int columnIndex) 
    throws SQLException { 
     List<GetMyStuffResult> results = new ArrayList<GetMyStuffResult>(); 
     Array array = cs.getArray(columnIndex); 

     // Add a TypeMap to map the Oracle object to a Java class 
     Map<String, Class<?>> typeMap = new HashMap<String, Class<?>>(); 
     typeMap.put("MySchema.MY_TYPE", GetMyStuffResult.class); 

     // Get an array of Java objects using that type map 
     Object[] javaObjects = (Object[]) array.getArray(typeMap); 

     // add each of these converted objects to the results list 
     for (Object javaObject : javaObjects) { 
      results.add((GetMyStuffResult) javaObject); 
     } 

     return results; 
    } 
} 

다음, DTO 클래스 자체가 모든 것을 함께 접착제에 ORADataORADataFactory을 구현하기 위해 필요를 : 물론

public class GetMyStuffResult implements ORAData, ORADataFactory { 

    string first_name; 
    string last_name; 

    // Assume appropriate getters and setters for all properties here 
    // public String getFirstName() { 
    //  | 
    //  | 

    // Implement ORAData and ORADataFactory 
    public ORAData create(Datum datum, int sqlType throws SQLException { 
     GetMyStuffResult result = new GetMyStuffResult(); 

     Struct javaStruct = (Struct) datum; 
     Object[] attributes = javaStruct.getAttributes(); 
     // ORDER MATTERS HERE - must be in order defined in Oracle 
     result.setFirstName(attributes[0].toString()); 
     result.setLastName(attributes[1].toString()); 
    } 

    public Datum toDatum(Connection conn) throws SQLException { 
     return null; 
    } 
} 

, 당신은 등 적절한 널 (null) 및 데이터 검사를 수행 할 수 있습니다