結果列にタイプを追加して @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 パラメータと一致する必要があることに注意してください。
遭遇する可能性のある落とし穴がいくつかあります。
- 多くのタイプの結果フィールド マッピングを複製する必要性
- 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>