使用mybatis将多个表映射到单个集合

时间:2019-05-10 12:57:05

标签: java xml mybatis

我有以下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。我该怎么办?

1 个答案:

答案 0 :(得分:2)

有可能,但是要将结果映射到单个public class MyPdfEventHandler: PdfPageEventHelper { protected List<PageIndex> Indice = new List<PageIndex>(); public override void OnStartPage(PdfWriter writer, Document document) { PageIndex pi = new PageIndex { Page = writer.CurrentPageNumber, Name = "Name Example", Text = "Text Example" } Indice.Add(pi); } } 中,您需要将结果连接到单个结果集中并使用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,查询可能会变得混乱。
最好执行10个单独的SELECT并在默认方法或服务层中手动构建UNION