簡體   English   中英

MyBatis和Generics:返回類型ArrayList <? extends MyClass> 返回Null

[英]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);

但它返回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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM