java - MyBatis 和泛型 : Return Type ArrayList<? extends MyClass> Returns Nulls

标签 java generics arraylist wildcard mybatis

我正在尝试使用 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);

但它返回一个 nullArrayList

用于访问它的 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 的类型参数匹配。

您可能会遇到几个陷阱:

  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>

关于java - MyBatis 和泛型 : Return Type ArrayList<? extends MyClass> Returns Nulls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308765/

相关文章:

java - 标签独特性

java - 将两个相同的表(相同的模式...)映射到 Hibernate 中的相同实体

Android - 随机列出按钮

java - validator 类内的依赖项未在单元测试中初始化

java - 里氏替换原则 - 我在这里违反了它吗?

swift - Swift 扩展中具有泛型类型参数的方法

Java:如何设计此类以具有可选泛型 ParameterType?

android:将可序列化对象放入 Intent 中的问题

java - maven - 构建时出现奇怪的 nfs 问题

java - 如何使文本区域文本在行结束时自动转到下一行?