[英]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.