繁体   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