Использование mybatis для отображения нескольких таблиц в одну коллекцию - PullRequest
0 голосов
/ 10 мая 2019

У меня есть следующий 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 я объединяю 10 таблиц в таблице testcase.Затем я могу использовать 10 различных тегов <resultMap>, чтобы сопоставить каждый фильтр с соответствующим полем в классе TestCase.

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

Однако я хочу отобразить всех из них.в одно поле, которое составляет List<Filter> filters.Как я могу это сделать?

1 Ответ

2 голосов
/ 13 мая 2019

Это возможно, но для сопоставления результатов в один 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 s вручную в методе по умолчанию или на уровне обслуживания.

...