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>