簡體   English   中英

如何從另一個映射器在 myBatis 映射器中設置參數

[英]How to set argument in myBatis mapper from another mapper

我在 myBatis 中映射有一些問題。

我有 pojo 課

public class Video {
    private int id;
    private String title;
    private Set<Person> actors;
    ...
    getters & setters
}

我有接口 PersonMapper

public interface PersonMapper {
@Select("${query}")
    Set<Person> getByFilmId(@Param("id") long id, @Param("query") PersonByFilmQueries query);

enum PersonByFilmQueries {

        ACTORS_BY_FILM(
                "select " +
                "   * " +
                "from " +
                "   actors a, " +
                "   film_actors fa " +
                "where " +
                "   fa.actor_id = a.id " +
                "and fa.film_id = #{id}"),
        ....
        WRITERS_BY_FILM(
                "select "+
                "* " +
                "from " +
                "writers w, " +
                "film_writers fw " +
                "where " +
                "fw.writer_id = w.id " +
                "and fw.film_id = #{id}");
        private String query;

        PersonByFilmQueries(String query) {
            this.query = query;
        }

        @Override
        public String toString() {
            return query;
        }
    }
}

我嘗試從另一個 xml 映射器 (VideoMapper.xml) 中重用這個選擇。

<mapper namespace="ru.common.mapper.VideoMapper">
    <resultMap id="video" type="Video">
    <id property="id" column="id"/>
    <result property="title" column="title"/>
    </resultMap>
    <collection property="actors" javaType="HashSet" ofType="Person" column="id" 
    select="ru.common.mapper.PersonMapper.getByFilmId">
    </collection>
</resultMap> 

我正在嘗試將 Person 集合添加到 Video POJO。 但我不明白如何使用 sql 在 getByFilmId 枚舉中設置第二個參數。 有什么簡單的方法可以做到這一點嗎? 如果我從 Java 調用此映射器,則沒有問題,一切正常

通常,您可以為關聯或集合的嵌套選擇指定多個參數。

如果query參數是簡單的字符串(而不是枚舉),您可以向主查詢添加一列,返回視頻列表,如下所示:

select id, title, ..., 'ACTORS_BY_FILM' query_type
from video

然后修改集合的映射:

 <collection property="actors" javaType="HashSet" ofType="Person" column="{id=id,query=query_type}" 
select="ru.common.mapper.PersonMapper.getByFilmId">

這樣,主查詢中的列idquery_type將作為參數傳遞給嵌套選擇。

在您的情況下,您需要 mybatis 在傳遞的字符串參數上調用構造函數,我認為 mybatis 不支持這一點。

您可以嘗試克服此問題的一種方法。 我不確定它是否會起作用,因為當您使用雙重替換時,您已經處於灰色地帶。 我會說這不是 mybatis 的預期行為。

不過你可以試試。 因此更改映射器方法以接受字符串。

然后,您可以創建一個輔助靜態方法,將查詢名稱轉換為查詢文本:

 public class PersonByFilmQueryBuilder {

     public static String getQuery(String queryId) {
          return PersonByFilmQueries.valueOf(queryId);
     }
 }

現在,您可以在 select 中的 OGNL 表達式中使用此靜態方法,如下所示:

@Select("${@com.mycompany.myapp.PersonByFilmQueryBuilder@getQuery(query)}")
Set<Person> getByFilmId(@Param("id") long id, @Param("query") String query);

我不太確定在這個查詢生成階段,mybatis 是否使用了成熟的 OGNL 表達式。 如果這樣做,這將起作用。

暫無
暫無

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

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