[英]MyBatis and Generics: Return Type ArrayList<? extends MyClass> Returns Nulls
我正在尝试使用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);
但它返回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的类型参数匹配。
您可能会遇到几个陷阱:
您可以尝试使用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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.