[英]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">
這樣,主查詢中的列id
和query_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.