×
文章路径: Java

分页的SQL一定要加上主键排序

发表于3年前(Dec 24, 2014 10:37:00 AM)  阅读 422  评论 0

分类: Java 数据库

标签: 分页sql 数据重复

换了一家新公司,做电商的,前两天经理交代一个任务,处理客户反馈的一个问题,问题很简单,是产品分页的时候,发现有两页竟然出现了同一个商品,我开始查代码。

系统数据持久层采用的是mybatis,之前没用过,听说过,一直用的hibernate。这里说句题外话,个人感觉hibernate还是好用点,hibernate配置要稍微简单点,配置映射关系就行,不需要写复杂sql,mybatis就要把sql写出来,写出来当然就麻烦点,我就看了我们系统里面的sql,一堆if,非常复杂,当然复杂的sql也有自身优势,实现的功能就更加灵活一点,有时使用hibernate碰到很复杂的裸机就发现无法配置,不过通常这时候我们会直接换成用jdbc直接查询,也不影响。耐着性子看了下sql,里面排序条件很多,都是根据商品价格,销量啊什么的,我把查询sql在后台打印出来,因为我不能直接连接正式库,我把sql稍微改了一下,一次查了10页的数据,发给现场人员让他帮忙把结果导出来。为什么一次查10页,当时是怕麻烦人家。导出的表格发现依然没有重复数据(之前已经查过产品表,没有录入重复数据)。我盯着那句sql看了半天,按价格排序,突然我脑中闪过,如果出现多个商品价格一样的,那他们的排序应该是随机的,于是我把那两页的sql单独找出来,再让人家在数据库查,看是不是有重复数据,验证我的猜想。坑爹的,反馈回来没有重复数据,而且页面上面也发现没问题了。但是问题不应该在这结束,然后我继续百度了一下,果然发现就是排序的问题,分页的sql后面一定要加上具有唯一索引字段的排序,一般使用主键,要不然很可能会出现重复数据。

回过头来,我突然发现这么严重的问题我以前竟然一直没有注意过,在使用hibernate时,我有些是没有使用排序的,但一直没发现过这个数据重复问题。我猜想hibernate是不是自己默认加上了主键排序,因为hibernate强制每个实体都加上了主键,可以做到自动使用主键排序,不过网上看到很多人使用hibernate时也出现数据重复。记下这个问题,下次使用hibernate时仔细验证一下。

发表评论