我有以下POJO,我希望mybatis将我的数据库条目映射到:

public class TestCase {

    private List<Filter> filters = new ArrayList<>();

}


我有10个过滤器实现,它们全部实现Filter接口。

public interface Filter {
    boolean isExcluded();
}


所有10个过滤器实现都有10个关联表。除了与testcase表的关系以外,这些表没有相同的列。

public class SomeFilter implements Filter {

    // Some implementation of Filter

}


在XML映射器中,我将testcase表上的10个表连接在一起。然后,我可以使用10个不同的<resultMap>标记将每个过滤器映射到TestCase类中的相应字段。

private List<Filter> myFilterA;
private List<Filter> myFilterB;
private List<Filter> myFilterC;


但是,我想将它们全部映射到单个字段,即List<Filter> filters。我怎样才能做到这一点?

最佳答案

可以,但是要将结果映射到单个List中,您需要将结果连接到单个结果集中并使用<discriminator />

假设有两个过滤器表,例如:

create table filter_a (
  testcase_id int,
  foo varchar(20)
);

create table filter_b (
  testcase_id int,
  bar int
);


映射器如下所示。

<resultMap type="TestCase" id="testCaseRM">
  <id column="testcase_id" />
  <collection property="filters" resultMap="filterRM" />
</resultMap>

<resultMap type="java.lang.Object" id="filterRM">
  <id column="filter_name" />
  <discriminator javaType="string" column="filter_name">
    <case value="a" resultType="FilterA">
      <result column="foo" property="foo" />
    </case>
    <case value="b" resultType="FilterB">
      <result column="bar" property="bar" />
    </case>
  </discriminator>
</resultMap>

<select id="selectAll" resultMap="testCaseRM">
  select testcase_id, 'a' filter_name, foo, null bar from filter_a
  union all
  select testcase_id, 'b' filter_name, null foo, bar from filter_b
</select>


请注意,我在查询中添加了filter_name以标识每一行的过滤器类型。

使用此方法,由于UNION,查询可能会变得混乱。
最好执行10个单独的SELECT并在默认方法或服务层中手动构建TestCase

关于java - 使用mybatis将多个表映射到单个集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56078196/

10-11 22:29
查看更多