author: Nathannie
date: 2022-04-16-22:58
问题背景
学习SSM项目,目标是点击前端店铺二级分类按钮,获取此分类对应shopCategoryId下的所有店铺信息列表,但点击无果,一直停留在等待刷新页面,解决甚久,花费一下午。
报错信息
报错截图:
问题分析
一直等待刷新,猜想获取不到数据,借此机会,决定从头到尾的研究一下此功能的实现过程,最后发现确实是获取不到数据,但不是没有数据,而是获取方式错误。
此分类下的内容需要分页展示(以动态刷新的方式),设置分页逻辑代码编写错误,使得获取的数据的索引(Index)超过真实数据(index)范围。
回顾分页逻辑:
rowIndex = (PageIndex-1) x PageSize
即表示按所需分页页数和分页单页数据个数得到的某页的首个数据项所在的索引位置。通俗来说,按照每页PageSize个数据项,获取第PageIndex页的第一个数据项的索引位置表示。
图示:
⚠️注意: 页数是按照,1,2,3..的逻辑开始,而行数(索引)是按照0,1,2,3...的逻辑开始,所以索引为0
的行,现实中的理解逻辑为第1
行,索引为3
的行,现实理解逻辑为第4
行。
上述图的索引为5
的行,现实逻辑就为第6
行。
上述算法可以由 RowIndex,pageSize得到PageIndex(第几页),由PageSize,PageIndex得到PageIndex页的首行数据项索引(在所有数据中占第几行)。
问题解决
主要原因是转化算法,参数写错了
错误的代码:
// 将pageIndex转为rowIndex
int rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);
// 调用方法获取shopList,count
List<Shop> shopList = shopDao.queryShopList(shopCondition, PageIndex, pageSize);
↑
这里应该是计算后的rowIndex
正确的代码:
// 将pageIndex转为rowIndex
int rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);
// 调用方法获取shopList,count
List<Shop> shopList = shopDao.queryShopList(shopCondition, rowIndex, pageSize);
上述pageIndex
,pageSize
是前端传递的参数,这里为1
,3
。
经过上述分析,实际数据库中数据只有一条:
按照错误代码的查询方式,则是“从第2行数据开始,查询3条数据”显然是没有的(没有第二行,也没有三个数据)
查询代码:
SELECT s.shop_id, s.shop_name, s.shop_desc, s.shop_addr, s.phone
, s.shop_img, s.priority, s.create_time, s.last_edit_time, s.enable_status
, s.advice, a.area_id, a.area_name, sc.shop_category_id, sc.shop_category_name
FROM tb_shop s, tb_area a, tb_shop_category sc
WHERE s.shop_category_id = 22
AND s.shop_category_id IN (
SELECT shop_category_id
FROM tb_shop_category
WHERE parent_id = 12
)
AND s.shop_category_id = sc.shop_category_id
AND s.area_id = a.area_id
ORDER BY s.priority DESC
-- LIMIT 1,3
LIMIT 0, 3
LIMIT 0, 3
这才是正确的分页参数。按照LIMIT 1,3
这个方式自然查不出数据。
⚠️本次问题最终是通过手动复制mapper
的查询代码到数据库管理软件(Navcat
)中进行查询验证是否查询sql有问题。因此为解决类似问题提供了一个思路:有问题从三层考虑:前端请求,业务处理,数据访问(sql语句) 。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。