2009-12-10 7 views
0

J'ai deux iBatis cartes sql qui sont reliés entre eux par un sous sélection, comme l'exemple simplifié ci-dessous:Ibatis: Existe-t-il un moyen d'ajouter un rowhandler dans une sous-sélection de map resultats d'Ibatis dans le xml de sqlmap?

<resultMap id="order" class="Order"> 
    <collection property="orderLines" ofType="OrderLine" resultMap=”orderLine”/> 
</resultMap> 

J'ai un objet de commande qui contient une collection d'objets de ligne qui sont renvoyés par une jointure et un association. Je souhaite effectuer une fonctionnalité de gestionnaire de ligne sur chaque ligne renvoyée par l'association imbriquée qui renvoie les lignes de commande.

Je sais que cela peut être réalisé en faisant passer dans un IListRowHandler au queryWithRowHandler appel lors de l'appel au printemps sqlmapclienttemplate pour une requête pour juste une liste d'objets OrderLine, mais cela ne me permet pas d'utiliser un rowhandler sur la collection subselect lorsque vous effectuez un appel uniquement sur la carte sql parent, commandez dans cet exemple.

Est-il possible d'assigner declaritively une classe rowhandler à un resultmap spécifique ou select dans une carte sql ibatis? Comme c'est le genre de fonctionnalité que je pense devrait être là. Ou bien je suis ouvert aux suggestions sur la modification de chaque instance des objets de ligne renvoyée par la sous sélectionnez comme ils sont plutôt renvoyées que d'interroger l'objet de commande entièrement construit et les manipuler après le fait.

Répondre

1

J'ai eu un coup d'œil à travers la documentation iBatis pour quelque chose qui conviendra sans succès.

So i ont mis en œuvre la solution suivante:

Sur la méthode Order.setOrderLines(collection orderLines) qui est rempli par l'intermédiaire d'ibatis à la suite de l'exécution de la requête, je mis en oeuvre une méthode de gestionnaire qui manipule chacun des orderLines au sein de la collection qui est sur le point d'être mis sur le Order. Cela n'obtient pas l'interception de chaque objet imbriqué tel qu'il est instancié et avant qu'il soit ajouté à la collection, mais il effectue le travail et l'exécute assez tôt et de manière agnostique de la requête pour qu'il soit activé chaque fois qu'une requête utilise le Order resultMap comme valeur de retour.

Je suis heureux de marquer toute solution de type déclaratif qui exécutent la tâche que je voulais d'abord que la réponse, si quelqu'un se présente avec un!

1

Il semble que vous utilisez N + 1 approche de sélection, ce qui pourrait entraîner de nombreux exécutés même pour sélectionner une requête simple et qui est généralement pas souhaitable. Voir la section «Résultats imbriqués pour l'association» dans le Guide de l'utilisateur d'iBatis qui fournit une solution alternative au problème, vous pouvez faire une jointure dans votre requête principale, puis utiliser l'agrégation au niveau resultMap pour mapper votre modèle d'objet. peut simplement utiliser un gestionnaire de ligne sur la requête principale.

+0

+1 pour les résultats imbriqués pour une association, j'ai utilisé cela dans d'autres requêtes que j'ai et cela peut être modifié en fonction. Je pourrais alors utiliser un manipulateur de ligne sur la requête principale mais il retournerait un objet de commande composite donc je devrais encore parcourir les lignes de commande à leur tour et les modifier. Je me demandais s'il y avait un moyen de le faire car ils étaient joints dans la requête via une spécification d'un gestionnaire sur une table de résultats - donc activés au fur et à mesure que chaque instance de cet objet était construite. – TomY