2017-05-23 20 views
1

Oracleユーザー定義のテーブル型をJavaオブジェクトのリストに変換するために、TypeHandlerを記述するのが難しいです。ユーザー定義のOracleテーブル型のMyBatis3 TypeHandlerの記述

データベースの種類と機能の仕様は、次のように定義されています。

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のマッパーを持っている:

<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> 

は最後に、私が書き込もうとしています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; 
    } 
} 

I canno私が望むリストにに入ったCallableStatementから届くようです。

答えて

0

これは私がこれを動作させるために行ったものです。

TypeHandler単一 Oracle型(ないテーブル型)を参照するタイプマップを作成する必要があります。

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; 
    } 
} 

、あなたは適切なヌルとデータのチェックをしたいだろう、など