【发布时间】:2019-01-11 04:02:00
【问题描述】:
我是mybatis的初级用户,想知道嵌套选择和嵌套结果的区别是不是就像子查询的区别 vs. join,尤其是在性能方面。还是会做一些优化?
我用的是mybatis 3.4.7版本和oracle DB。
这里有一个例子供参考:
private List<Post> posts;
<resultMap id="blogResult" type="Blog">
<collection property="posts" javaType="ArrayList" column="id"
ofType="Post" select="selectPostsForBlog"/>
</resultMap>
<select id="selectBlog" resultMap="blogResult">
SELECT * FROM BLOG WHERE ID = #{id}
</select>
<select id="selectPostsForBlog" resultType="Post">
SELECT * FROM POST WHERE BLOG_ID = #{id}
</select>
或
<select id="selectBlog" 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>
<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>
如果嵌套 select like 子查询还有 N+1 的问题?
对于在特定环境或条件下哪个表现更好,您有什么建议或经验吗?非常感谢:)。
【问题讨论】:
-
只是提一下 - 在第一个示例中,您正在执行 INNER JOIN,第二个示例不一样。另一方面,第二个选择更加灵活。而且,IMO,oracle 会将两者转换为相同的选择(假设嵌套选择中的 INNER JOIN)。