Повторное использование результирующей карты для разных имен столбцов
-
03-07-2019 - |
Вопрос
Есть ли способ повторно использовать одну и ту же результирующую карту несколько раз в одном запросе?
Например, предположим, что у меня есть результирующая карта "foo":
<resultMap id="foo" class="Foo">
<result property="Bar" column="bar" />
</resultMap>
Есть ли способ определить другую результирующую карту, которая повторно использует приведенное выше для разных столбцов?Что-то вроде...
<resultMap id="fizz"class="Fizz">
<result property="Foo1" column="bar=bar1" resultMapping="foo" />
<result property="Foo2" column="bar=bar2" resultMapping="foo" />
<result property="Foo3" column="bar=bar3" resultMapping="foo" />
</resultMap>
Решение
Почти.Если вы выберете идентификатор Foo в своем запросе, вы можете заставить карту результатов Fizz выполнить SELECT для этого идентификатора, который будет использовать карту результатов Foo.
<result property="Foo1" column="bar1Id" select="selectFoo"/>
(Предполагая, что у вас есть selectFoo
запрос определен.) Но это чрезвычайно медленно при больших наборах результатов, поскольку для каждой строки выполняется дополнительный SELECT.
У iBatis есть решение этой проблемы для типичного случая, когда у вас есть составной объект, который содержит различные другие объекты.Сначала вы определяете запрос, который соединяет ваши таблицы, затем вы можете использовать fooMap
чтобы заполнить Foo
:
<result property="Foo1" resultMap="fooMap"/>
Но вы не можете использовать эту результирующую карту дважды для двух разных Foos
потому что результирующая карта указывает определенные имена столбцов.Однако вы можете использовать другую технику:
<result property="foo1.bar" column="foo1bar"/>
<result property="foo2.bar" column="foo2bar"/>
Более подробная информация приведена на странице 35 руководства iBatis Datamapper.
Другие советы
вы могли бы использовать результирующие карты, которые расширяют другую результирующую карту например
<resultMap id="document" class="Document">
<result property="Id" column="Document_ID"/>
<result property="Title" column="Document_Title"/>
<discriminator column="Document_Type" type="string"/>
<subMap value="Book" resultMapping="book"/>
<subMap value="Newspaper" resultMapping="newspaper"/>
</resultMap>
<resultMap id="book" class="Book" extends="document">
<property="PageNumber" column="Document_PageNumber"/>
</resultMap>
Подробная информация: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s05.html