2013-10-11 72 views
3

我试图使用MyBatis的返回是从一个超类扩展的一种类型:MyBatis和泛型:返回类型ArrayList <?扩展MyClass的>返回空值

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 S的ArrayList

DAO用来访问它使用相同的扩展通配符语法,所以我假设问题是MyBatis映射器不喜欢它。但是,我还没有找到任何文件说明情况。

有没有人有任何建议,或可能解决这个问题?

+0

如何mybatis假设知道哪种类型的ContentProviderBean返回? $ {type}是不够的信息。通常你会使用@TypeDiscriminator,但是这只会根据列。 –

回答

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); 

注意,若value属性应该匹配getFeed的Param类型。

有几个陷阱,你可能会遇到:

  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>