3

MyBatis を使用して、スーパー クラスから拡張された型を返そうとしています。

Mapper.java

@Select("SELECT * FROM ${type} WHERE objectId >= ${start} AND objectId <= ${end}")
ArrayList<? extends ContentProviderBean> getFeed(@Param("type") String type, @Param("start") int start, @Param("end") int end);

しかし、それは s を返しArrayListますnull

これにアクセスするために使用される DAO は同じ extends ワイルドカード構文を使用するため、問題は MyBatis マッパーがそれを好まないことにあると思います。ただし、これが事実であると言っているドキュメントを見つけることができませんでした。

この問題に対する提案や回避策はありますか?

4

1 に答える 1

2

結果列にタイプを追加して @TypeDiscriminator を構成し、インスタンス化するクラスのヒントを mybatis に提供することができます。

@Select("SELECT t.*, ${type} as type_discriminator" + 
        " FROM ${type} as t " +
        " WHERE objectId >= ${start} AND objectId <= ${end}")
@TypeDiscriminator(column = "type_discriminator",
    cases = {
        @Case (value="SomeContentProviderBeanSubclass", 
               type=SomeContentProviderBeanSubclass.class,
            results={
                @Result(property="someField", column="some_field"),
                // other columns mapping
        }),
        @Case (value="OtherContentProviderBeanSubclass", 
               type=OtherContentProviderBeanSubclass.class,
            results={
                @Result(property="otherField", column="other_field"),
        }),
        // @Cases for other ContentProviderBean subclasses
})
ArrayList<? extends ContentProviderBean> getFeed(@Param("type") String type,
       @Param("start") int start, @Param("end") int end);

Case の value 属性は、getFeed の type パラメータと一致する必要があることに注意してください。

遭遇する可能性のある落とし穴がいくつかあります。

  1. 多くのタイプの結果フィールド マッピングを複製する必要性
  2. mybatis アノテーションを使用する場合、自動列マッピングを使用することはできません

これらの問題を解決するには、xml マッピング構成を使用します。次のようになります。

<resultMap id="resultContentProviderBean"
           type="ContentProviderBean"
           autoMapping="true">
    <id property="id" column="id"/>
    <discriminator javaType="string" column="employee_type">
        <case value="SomeContentProviderBeanSubclass"
              resultType="SomeContentProviderBeanSubclass"
              autoMapping="true"/>
        <case value="OtherContentProviderBeanSubclass" 
              resultType="OtherContentProviderBeanSubclass"
              autoMapping="true"/>
    </discriminator>
</resultMap> 

<select id="getFeed" resultMap="resultContentProviderBean">
    SELECT t.*, ${type} as type_discriminator
      FROM ${type} as t 
    WHERE objectId >= ${start} AND objectId <= ${end}
</select>
于 2013-11-01T08:57:21.863 に答える