目前,我正在使用Spring 3.2.0,Hibernate 4.2.0.CR1和Oracle 10g的Web應用程序。應使用Hibernate爲主鍵Long或Integer選擇哪種數據類型?
Oracle表中的主鍵是序列生成的,它們全部在Hibernate實體中映射爲Long
類型。實際上,沒有分頁系統幾乎是不可能的。
我通常使用以下方法從數據庫表中的行列表中檢索子列表。
sessionFactory.getCurrentSession()
.createQuery("from Entity order by entityId desc")
.setFirstResult(currentPage)
.setMaxResults(pageSize)
.list();
的setFirstResult()
和setMaxResults()
方法只接受的類型的int
作爲其參數。當然,int
類型對於setMaxResults()
方法綽綽有餘,但如果某人在表中有多行並且他/她需要檢索一個子列表(如50行)(從,Integer.MAX_VALUE
開始)?
假設給定表格中有多於2,147,483,647
行。當然,我可以理解給定值2,147,483,647
是一個很大的數字,但是爲什麼對於主鍵使用Long
類型,如果setFirstResult()
方法只接受int
類型,會出現問題?即使使用可接受除int
以外的標準API,我也沒有看到此方法的任何重載版本,但實際上很少看到沒有分頁的系統。
我可以理解它,但是如果我們需要從超出'Integer.MAX_VALUE'開始獲取行的子列表,則需要提供給'setFirstResults()'的參數值將大於'Integer.MAX_VALUE' (這不會被接受,因爲這個方法只接受一種'int'作爲參數)。不是嗎?我在哪裏迷路? – Tiny
@Tiny:你從「超越Integer.MAX_VALUE」開始意味着什麼?我的意思是,你是否在討論滾動超過20億行的結果集? –
假設一個表的行數多於'Integer.MAX_VALUE'行,即多於'2,147,483,647'行。假設有人需要從'2,147,483,647 + 10'開始檢索50行的列表,即'2,147,483,657',它在'int'的有效範圍之外。因此,在這方面,不太可能使用'setFirstResults()'方法來設置,也就是說我可以**不**將這個值作爲參數傳遞給這個方法,比如''setFirstResults(2147483657)' - 這會報告編譯時錯誤。是否可以告訴Hibernate設置一個起始位置來檢索這樣的行子列表? – Tiny