我正在尝试使用 MyBatis 返回一个从父类(super class)扩展的类型:
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);
但它返回一个 null
的 ArrayList
。
用于访问它的 DAO 使用相同的扩展通配符语法,所以我假设问题是 MyBatis 映射器不喜欢它。但是,我还没有找到任何说明情况如此的文档。
有人对此问题有任何建议或可能的解决方法吗?
最佳答案
您可以尝试将类型添加到结果列并配置@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 的类型参数匹配。
您可能会遇到几个陷阱:
- 需要为多种类型复制结果字段映射
- 使用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>
关于java - MyBatis 和泛型 : Return Type ArrayList<? extends MyClass> Returns Nulls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308765/