我有以下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/