I just committed the last feature I wanted to get in before recommending
that we release an iBATIS 3 beta.  We have some documentation to do, but
otherwise, I consider iBATIS 3 feature complete.

This last feature allows for nested mapping of join results in a single
mapped statement.  This avoids having to chain result maps, at the cost of
losing the ability to reuse the sub-result maps.  I personally don't value
reuse as much as I do readability and simplicity.

The following example demonstrates a 5 table join with a single result map,
auto mapping, nested collections, nested discriminators, nested
associations, enums, ids, etc..... Almost the complete sum total of the
newest features of iBATIS 3 are apparent in this one example.

Watch for iBATIS 3 (for Java) Beta, soon.

*<mapper namespace="domain.blog.mappers.NestedBlogMapper">*

*  <resultMap id="blogJoinedWithPostsAndAuthor" type="Blog">
*    <id property="id" column="blog_id"/>
    <result property="title" column="blog_title"/>
*    <association property="author" column="blog_author_id"
javaType="domain.blog.Author">
*      <id property="id" column="author_id"/>
      <result property="username" column="author_username"/>
      <result property="password" column="author_password"/>
      <result property="email" column="author_email"/>
      <result property="bio" column="author_bio"/>
      <result property="favouriteSection"
column="author_favourite_section"/>
    </association>
*    <collection property="posts" ofType="domain.blog.Post">
*      <id property="id" column="post_id"/>
      <result property="subject" column="post_subject"/>
*      <association property="author" column="post_author_id"
javaType="domain.blog.Author"/>
**      <collection property="comments" column="post_id"
ofType="domain.blog.Comment" >
*        <id property="id" column="comment_id"/>
      </collection>
*      <collection property="tags" column="post_id" ofType="domain.blog.Tag"
>
*        <id property="id" column="tag_id"/>
      </collection>
*      <discriminator javaType="int" column="draft">
        <case value="1" resultType="domain.blog.DraftPost"/>
*      </discriminator>
    </collection>
  </resultMap>

*  <select id="selectBlogJoinedWithPostsAndAuthor" parameterType="int"
resultMap="blogJoinedWithPostsAndAuthor">*
    select
      B.id as blog_id,
      B.title as blog_title,
      B.author_id as blog_author_id,
      A.id as author_id,
      A.username as author_username,
      A.password as author_password,
      A.email as author_email,
      A.bio as author_bio,
      A.favourite_section as author_favourite_section,
      P.id as post_id,
      P.blog_id as post_blog_id,
      P.author_id as post_author_id,
      P.created_on as post_created_on,
      P.section as post_section,
      P.subject as post_subject,
      P.draft as draft,
      P.body as post_body,
      C.id as comment_id,
      C.post_id as comment_post_id,
      C.name as comment_name,
      C.comment as comment_text,
      T.id as tag_id,
      T.name as tag_name
    from Blog B
      left outer join Author A on B.author_id = A.id
      left outer join Post P on B.id = P.blog_id
      left outer join Comment C on P.id = C.post_id
      left outer join Post_Tag PT on PT.post_id = P.id
      left outer join Tag T on PT.tag_id = T.id
    where B.id = #{id}
  </select>

Reply via email to