在做音視頻網站審核的時候,發現分頁出現了重復記錄。原以為是自己程序出了問題,可仔細檢查了程序之后,并沒有發現有什么不對的地方,于是上網查了一下,原來是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的排序功能,
          如果需要使用排序,一定要選擇那些建有唯一索引的字段。當然有時候我們可能需要對
          那些不是唯一索引的字段進行排序,這些字段的值可能大量重復也可能為空,怎么辦,
          這時候可以采用聯合字段排序,也就是排序字段中包含一個主鍵或不會重復的字段。

          Feedback

          # re: 使用hibernate對oracle數據庫中數據分頁出現重復記錄  回復  更多評論   

          2013-07-15 16:56 by 游客
          學習了!

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 瑞金市| 云浮市| 阳信县| 泾源县| 六盘水市| 台中县| 焦作市| 克拉玛依市| 景宁| 沾化县| 林甸县| 庄浪县| 福清市| 绍兴县| 偃师市| 海丰县| 耒阳市| 庄浪县| 台南市| 营口市| 莒南县| 叙永县| 江门市| 罗山县| 潜山县| 彩票| 肃南| 镇康县| 桐城市| 庄浪县| 淮北市| 镇宁| 蒙城县| 南投市| 文成县| 屯昌县| 祁连县| 睢宁县| 永丰县| 河源市| 普宁市|