使用hibernate对oracle数据库中数据分页出现重复记录

 在做音视频网站审核的时候,发现分页出现了重复记录。原以为是自己程序出了问题,可仔细检查了程序之后,并没有发现有什么不对的地方,于是上网查了一下,原来是oracle分页机制的问题,在oracle中,分页是通过rownum函数来实现的,

rownum顺序号的生成是排序后生成的,例如下面这条sql:

select * from user where rownum <= 20 and rownum > 10 order by userName

按照我们正常的理解,这条sql查询的是user表中按照userName升序后取其10~20条记录,

其实不然,oracle是排序后才生成rownum,理想情况下如userName在user表的值是唯一

的或者userName在数据库中被建了唯一索引,结果是正确的,但是如果userName的值存在

大量重复记录或者为空,就会出现问题重复记录的情况。正确的sql应该这样写:

select * from (select * from (select * from user order by userName)

where rownum <= 20) where rownum >=10

但是这并不能从根本上解决问题,为了避免这种情况,建议慎用oracle的排序功能,

如果需要使用排序,一定要选择那些建有唯一索引的字段。当然有时候我们可能需要对

那些不是唯一索引的字段进行排序,这些字段的值可能大量重复也可能为空,怎么办,

这时候可以采用联合字段排序,也就是排序字段中包含一个主键或不会重复的字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值