2009-02-04 8 views
5

Powiedzmy mam tej klasy:Jak wdrożyć relacje jeden-do-wielu w Ibatis?


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

    Class B { 
     int id; 
     // Other properties 
    } 

klasa A ma związek z klasy B. jeden-do-wielu mam już usługę, która buforuje obiekty B i odesłać je na id.

schematu Tabela wygląda tak


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

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

Teraz, jak mam to w iBatis map?

Ponieważ obiekty B są już buforowane, chcę uzyskać listę identyfikatorów w obiektach A, a następnie użyć usługi do wzbogacania As.

Czy ktoś może zasugerować, jak to zrobić?

Dwa możliwe alternatywy mogę myśleć to:

  1. Załóż wewnętrzną klasy A (AtoB mapie) i użyć kwerendy wybierającej w iBatis config, aby wypełnić tę
  2. Wewnątrz iBatis resultMap/select użytku inny wybierz, aby uzyskać listę BIDów (niezbyt pewny, jak to zrobić w konfiguracji).

Odpowiedz

0

Nie jestem pewien, czy dobrze zrozumiałem twoje pytanie.

Zakładając, że będziesz wyszukiwać w oparciu o identyfikator A, jak napisać zapytanie w ibatis, które łączy dwie tabele?

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

Następnie można użyć „” queryForMap powrót HashMap z a_id vs (zbiór rekordów z zapytania). Zastosować metodę niestandardową do przekształcenia tej struktury danych do obiektu „A”

+0

Niż ks Rahul. Ale problem z tym podejściem byłby następujący: "Zbyt wiele obiektów", a my w końcu wykonalibyśmy group_by (podobny) w kodzie. – Jagmal

1

w mybatis 3 to trochę inaczej. Możesz to zrobić, podając dwie instrukcje select lub możesz użyć join, a następnie utworzyć resultMap z tagiem kolekcji.

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

lub użyć dołączyć

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

i powodują map

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

można uzyskać pełną totorial z instrukcji iBatis tutaj:

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