Reutilizar um resultMap para diferentes nomes de coluna
-
03-07-2019 - |
Pergunta
Existe uma maneira de reutilizar a mesma resultMap várias vezes em uma única consulta.
Por exemplo, suponha que eu tenho um resultMap "foo":
<resultMap id="foo" class="Foo">
<result property="Bar" column="bar" />
</resultMap>
Existe uma maneira para definir outro resultMap que reutiliza o acima para diferentes colunas? Algo como ...
<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>
Solução
Quase. Se você selecionar a ID do Foo em sua consulta, você pode ter o mapa resultado Fizz executar um SELECT para essa ID, que usará o mapa resultado Foo.
<result property="Foo1" column="bar1Id" select="selectFoo"/>
(Supondo que você tenha uma consulta selectFoo
definido.) Mas isso é extremamente lento com grandes conjuntos de resultados, uma vez que faz um seletos adicionais para cada linha.
iBATIS tem uma solução para este problema para o caso típico, onde você tem um objeto composto que contém vários outros objetos. Primeiro, você definir uma consulta que associa as tabelas, então você pode usar fooMap
para preencher um Foo
:
<result property="Foo1" resultMap="fooMap"/>
Mas você não pode usar esse mapa resultado duas vezes para dois Foos
diferente porque o mapa resultado especifica certos nomes das colunas. Você pode usar uma outra técnica, no entanto:
<result property="foo1.bar" column="foo1bar"/>
<result property="foo2.bar" column="foo2bar"/>
Mais detalhes na página 35 do manual iBatis Datamapper.
Outras dicas
você poderia usar resultmaps, que se estendem outra resultmap por exemplo.
<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>
Mais informações: http://ibatis.apache.org/docs/dotnet /datamapper/ch03s05.html