1

現在、iBatis から myBatis へのアップグレードに取り組んでいます。Ibatisでは、次のようなSQLマップがあります

<resultMap id="PCRV_HIERARCHY_LVL_LIST_MAP" class="com.fmrco.sai.aadpm.domain.ConstraintHierarchyLevel">
    <result property="levelId" column="LEVEL_ID"/>
    <result property="levelDescription" column="LEVEL_DESCRIPTION"/>
    <result property="levelRank" column="LEVEL_RANK"/>
    <result property="levelCode" column="LEVEL_CODE"/>
</resultMap>

<parameterMap id="GET_HIERARCHY_LVL_LIST_MAP" class="java.util.Map">
    <parameter property="PCRV_HIERARCHY_LVL_LIST" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="PCRV_HIERARCHY_LVL_LIST_MAP"/>
</parameterMap>


<procedure id="GET_HIERARCHY_LVL_LIST" parameterMap="GET_HIERARCHY_LVL_LIST_MAP">
    { call GET_HIERARCHY_LVL_LIST ( ? ) }
</procedure>

myBatis が提供する機能 (マッパーの実装を実装する必要がない、parameterMap などの非推奨の機能を使用しないなど) を最大限に活用したいのですが、いくつか問題があります。戻り値のプロパティを設定しようとしてエラーが発生し続けたので、resultSet オブジェクトをラッパー オブジェクトでラップする必要がありましたが、これは避けたいものです。

Mapper.java
public void getHierarchyLevels(ListConstraintHierarchyLevel constraintHierarchyLevels);

ConstraintHierarchyLevel クラス

public class ListConstraintHierarchyLevel {
    private List<ConstraintHierarchyLevel> constraintHierarchyLevels ;


    public List<ConstraintHierarchyLevel> getConstraintHierarchyLevels() {
        return constraintHierarchyLevels;
    }


    public void setConstraintHierarchyLevels(List<ConstraintHierarchyLevel> constraintHierarchyLevels) {
        this.constraintHierarchyLevels = constraintHierarchyLevels;
    }
}

mapper.xml

<resultMap id="HierarchyLvlMap" type="com.fmrco.sai.aadpm.domain.ConstraintHierarchyLevel">
    <result property="levelId" column="LEVEL_ID"/>
    <result property="levelDescription" column="LEVEL_DESCRIPTION"/>
    <result property="levelRank" column="LEVEL_RANK"/>
    <result property="levelCode" column="LEVEL_CODE"/>
</resultMap>

<select statementType="CALLABLE" 
    id="getHierarchyLevels" 
    parameterType="com.fmrco.sai.aadpm.domain.ListConstraintHierarchyLevel" 
    resultMap="HierarchyLvlMap">
    { call GET_HIERARCHY_LVL_LIST ( 
        #{constraintHierarchyLevels, 
        jdbcType=CURSOR,
        mode=OUT,
        javaType=java.sql.ResultSet,
        resultMap=HierarchyLvlMap}
     ) }
</select>

別の解決策を試みましたが失敗しました。このソリューションでは、param アノテーションを利用します

mapper.java

public void getHierarchyLevelsWithParam(@Param("constraintHierarchyLevels") List<ConstraintHierarchyLevel> constraintHierarchyLevels); 

上記と同じresultMapを使用していますが、選択ブロックが異なります

mapper.xml

     <select statementType="CALLABLE" 
    id="getHierarchyLevelsWithParam" 
    parameterType="list" 
    resultMap="HierarchyLvlMap">
    { call GET_HIERARCHY_LVL_LIST ( 
        #{constraintHierarchyLevels, 
        jdbcType=CURSOR,
        mode=OUT,
        javaType=java.sql.ResultSet,
        resultMap=HierarchyLvlMap}
     ) }

これを実行するとき、MapperMethod クラスを実行メソッドにデバッグし、Object パラメータは結果セットから正しいデータを取得しますが、これは送信された引数 (List) に配置されないため、これらの値は返されません。オブジェクトラッパーで最初のメソッドを実行すると、オブジェクトは送信された引数に配置されるため、取得可能になります。

ありがとう

4

1 に答える 1

1

結果オブジェクトをラップする以外の方法はわかりません。実際、OUT 変数は何かにバインドする必要があります。これは変数のスコープの問題であり、インダイレクションは必須です。しかし、それは一般的である可能性があります:

class Wrapper<T> {
private List<T> member;
}

@Param アノテーションは実際には、SQL で参照として使用する名前をパラメーターに付けるために使用されます (特にマッパー メソッドに複数のパラメーターがある場合)。

于 2016-10-27T10:12:17.577 に答える