2009-02-04 7 views
5

Disons que j'ai cette classe:Comment implémenter des relations un-à-plusieurs dans Ibatis?


    Class A { 
     int id; 
     int[] b; 
     // Other properties 
    } 

    Class B { 
     int id; 
     // Other properties 
    } 

La classe A a un à plusieurs relations avec la classe B. J'ai déjà un service qui met en cache les objets B et les retourner sur id.

Le tableau schéma ressemble à ceci


    Table a: 
    ------- 
     int id, 
     prop1, 
     etc 

    Table a_to_b_map 
    ---------------- 
     int a_id, 
     int b_id 

Maintenant, comment puis-je mapper cela dans iBatis? Puisque les objets B sont déjà mis en cache, je veux obtenir la liste des identifiants dans les objets A, puis utiliser le service pour enrichir As.

Quelqu'un peut-il suggérer comment s'y prendre?

Deux alternatives possibles, je peux penser sont:

  1. Créer une classe interne en A (carte AtoB) et utiliser une requête de sélection dans la configuration iBatis pour remplir cette
  2. A l'intérieur du iBatis resultMap/select utilisation un autre sélectionnez pour obtenir la liste des identifiants B (pas trop sûr sur la façon de le faire dans la configuration)

Répondre

0

Je ne sais pas si j'ai bien compris votre question.

En supposant que vous interrogez en fonction de l'ID de A, que diriez-vous d'écrire une requête dans ibatis qui joint les deux tables?

select * 
from a, a_to_b_map 
where a.id = #id# and a.id = a_to_b_map.a_id 

Vous pouvez alors utiliser un 'queryForMap' pour retourner un hashmap de a_id vs (collection d'enregistrements de la requête). Utilisez une méthode personnalisée pour convertir cette structure de données dans un objet de 'A'

+0

Than ks Rahul. Mais le problème avec cette approche serait: "Trop d'objets" et nous finirions par faire le group_by (similaire) dans le code. – Jagmal

1

dans mybatis 3 c'est un peu différent. Vous pouvez le faire en spécifiant deux instruction select ou vous pouvez utiliser join puis créer resultMap avec le tag de collection.

<resultMap id=”blogResult” type=”Blog”> 
    <collection property="posts" javaType=”ArrayList” column="blog_id" 
     ofType="Post" select=”selectPostsForBlog”/> 
</resultMap> 

<select id=”selectBlog” parameterType=”int” resultMap=”blogResult”> 
    SELECT * FROM BLOG WHERE ID = #{id} 
    </select> 
<select id=”selectPostsForBlog” parameterType=”int” resultType="Author"> 
    SELECT * FROM POST WHERE BLOG_ID = #{id} 
    </select> 

ou vous pouvez utiliser rejoindre

<select id="selectBlog" parameterType="int" resultMap="blogResult"> 
select 
    B.id as blog_id, 
    B.title as blog_title, 
    B.author_id as blog_author_id, 
    P.id as post_id, 
    P.subject as post_subject, 
    P.body as post_body, 
from Blog B 
    left outer join Post P on B.id = P.blog_id 
where B.id = #{id} 
</select> 

et carte de résultat

<resultMap id="blogResult" type="Blog"> 
    <id property=”id” column="blog_id" /> 
    <result property="title" column="blog_title"/> 
    <collection property="posts" ofType="Post"> 
    <id property="id" column="post_id"/> 
    <result property="subject" column="post_subject"/> 
    <result property="body" column="post_body"/> 
    </collection> 
</resultMap> 

vous pouvez obtenir totorial complète du guide utilisateur ibatis ici:

http://svn.apache.org/repos/asf/ibatis/java/ibatis-3/trunk/doc/en/iBATIS-3-User-Guide.pdf

Questions connexes