2008-10-15 19 views
0

Existe-t-il un moyen de réutiliser plusieurs fois le même resultMap dans une seule requête?Réutilisation d'un resultMap pour différents noms de colonnes

Par exemple, supposons que j'ai un resultMap « foo »:

<resultMap id="foo" class="Foo"> 
    <result property="Bar" column="bar" /> 
</resultMap> 

Est-il possible de définir une autre resultMap qui réutilise ci-dessus pour les différentes colonnes? Quelque chose comme ...

<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> 

Répondre

2

Presque. Si vous sélectionnez l'ID du Foo dans votre requête, vous pouvez faire en sorte que la carte de résultats Fizz exécute un SELECT pour cet ID, qui utilisera la carte de résultats Foo.

<result property="Foo1" column="bar1Id" select="selectFoo"/>

(En supposant que vous avez une requête selectFoo définie.) Mais ce qui est extrêmement lent avec de grands résultats, car il le fait pour chaque ligne une somme supplémentaire SELECT.

iBATIS a une solution à ce problème pour le cas typique, où vous avez un objet composite qui contient divers autres objets. Tout d'abord, vous définissez une requête qui joint vos tables, vous pouvez utiliser fooMap pour remplir un Foo:

<result property="Foo1" resultMap="fooMap"/>

Mais vous ne pouvez pas utiliser cette carte de résultat deux fois pour deux différents Foos parce que la carte de résultat précise certains noms de colonne. Vous pouvez utiliser une autre technique, bien que:

<result property="foo1.bar" column="foo1bar"/>
<result property="foo2.bar" column="foo2bar"/>

plus en détail à la page 35 du manuel iBatis DataMapper.

+0

C'est malheureux. Dans mon cas, le résultat que je voudrais réutiliser est plutôt simple et je l'ai seulement touché en une seule requête, donc je vais le garder simple et juste * gasp * copier-coller pour le moment. – Andrew

1

vous pourriez utiliser resultmaps, qui étendent une autre carte résultat par exemple.

<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> 

plus d'info: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s05.html