MyBatis一对多或多对多分页查询的结果条数不符合预期的问题解决

问题描述

​ 通常我们我们在单表查询中我们可以采用limit进行分页查询,这样可以减少页面的显示量,加快页面想应速度。但是在MyBatis框架中,如果我们在一对多或多对多查询中直接使用limit关键字的话会产生查询结果数量不够的情况

我们先给出一个关系模型:

MyBatis一对多或多对多分页查询的结果条数不符合预期的问题解决

​ blog_tag(标签表)和blog_article(文章表)是多对多关系,article_tag是多对多关系中的联系表。

传统的分页查询

​ 我们需要分页查询blog_article表,然后关联查询“文章的标签”表,执行SQL如下:

-- 只查询表中一小部分字段是为了演示方便,我们分页article表的8条数据
SELECT
	a.id,
	a.title,
	t.tagname,
	t.article_num
FROM
	blog_article a
	LEFT JOIN article_tag a_t ON a.id = a_t.article_id
	LEFT JOIN blog_tag t ON a_t.tag_id = t.id 
	LIMIT 0,8

查询结果:

MyBatis一对多或多对多分页查询的结果条数不符合预期的问题解决

​ 我们可以看到查询的结果中虽然有8条数据,但是不是我们想要的8条article数据,如果上述结果被MyBatis封装只会得到4个BlogArticle对象。这就开头提出的问题的产生原因。

解决方案

​ 我们可以采用子查询分页的方式来解决这个问题。

SELECT
	a.id,
	a.title,
	t.tagname,
	t.article_num
FROM
	(select id,title from blog_article limit 0,8) a
	LEFT JOIN article_tag a_t ON a.id = a_t.article_id
	LEFT JOIN blog_tag t ON a_t.tag_id = t.id 

执行结果:

MyBatis一对多或多对多分页查询的结果条数不符合预期的问题解决
​ 通过上述方案,我们才能得到8条BlogArticle对象。