2010-03-18 12 views
20

J'utilise iBATIS pour appeler une procédure stockée sur MSSQL Server, les paramètres d'entrée sont des propriétés sur un POJO qui est mis à la carte:paramètre de sortie de procédure stockée remis à POJO par iBATIS

Map<String, Object> saveMap = new HashMap<String, Object>(); 
saveMap.put("obj", myArticle); 
update("save", saveMap); 

Tous les paramètres sont correctement définis en entrée de la procédure, donc rien de mal là. Mais l'un des paramètres est un paramètre de sortie et je m'attendais à ce qu'il soit réglé sur le POJO, mais à la place, un mappage supplémentaire "obj.new"=false est placé sur la carte par iBATIS. Voici une version simplifiée de la mise en correspondance montrant l'idée de base:

<procedure id="save"> 
    {<include refid="Core.returned_value" /> 
    CALL SPRC_ARTICLE_NAME_SAVE (
     <include refid = "Core.common_fields" /> 
     @pArticle_id = #obj.art_id# 
    , @pArtname = #obj.artname# 
    , @pNewArticleName_flg = #obj.new,mode=INOUT# 
    )} 
</procedure> 

Après avoir appelé la procédure que j'ai deux correspondances dans la carte est passé à iBATIS:

  • "obj"=POJO
  • "obj.new"=False

Maintenant, je vois que iBatis documentation dit "Lors de l'exécution procédure stockée res-iBATIS va créer des objets pour les paramètres OUTPUT " donc ça a du sens. Mais ma question est de savoir s'il existe un moyen d'instruire iBATIS de renvoyer la valeur booléenne au POJO après l'appel de la procédure? Je préfère ne pas faire le travail supplémentaire de tirer la valeur de la carte et de le mettre au POJO moi-même.

// Uhlen

+0

Je trouve la réponse de Jeff Butler à la réponse de cette Jeff Butler à ce poste de http://groups.google.com/group/mybatis-user/browse_thread/thread/14826bc31c9f143d être très utile lorsque je faisais face à un problème similaire (bien qu'avec une déclaration select plutôt qu'une mise à jour) –

Répondre

1

Vous pouvez en utilisant une carte de paramètres explicites. Voir Page 21 of the manual

C'est plutôt verbeux mais cela a fonctionné pour moi dans le passé.

<parameterMap id="swapParameters" class="map" > 
    <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/> 
    <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/> 
</parameterMap> 

<procedure id="swapEmailAddresses" parameterMap="swapParameters" > 
    {call swap_email_address (?, ?)} 
</procedure>