2013-03-28 36 views
1

目前,我正在使用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,我也沒有看到此方法的任何重載版本,但實際上很少看到沒有分頁的系統。

回答

0

Query.setFirstResult無關與主鍵,文件說:

查詢setFirstResult(INT FIRSTRESULT)

Set the first row to retrieve. If not set, rows will be retrieved beginning 
from row 0. 

Parameters: 
    firstResult - a row number, numbered from 0 

當你說

如果什麼有人在桌上有很多行,他/她需要 retrieve e從我們開始的50行開始的子列表, Integer.MAX_VALUE?

它應該沒有什麼起始鍵值,結果集從0開始編號。在實踐中,你不會寫一個查詢,讓它滾動前20億行,然後之後獲得下一個50,所以我不希望在查詢API中使用int是一個問題。

+0

我可以理解它,但是如果我們需要從超出'Integer.MAX_VALUE'開始獲取行的子列表,則需要提供給'setFirstResults()'的參數值將大於'Integer.MAX_VALUE' (這不會被接受,因爲這個方法只接受一種'int'作爲參數)。不是嗎?我在哪裏迷路? – Tiny

+0

@Tiny:你從「超越Integer.MAX_VALUE」開始意味着什麼?我的意思是,你是否在討論滾動超過20億行的結果集? –

+0

假設一個表的行數多於'Integer.MAX_VALUE'行,即多於'2,147,483,647'行。假設有人需要從'2,147,483,647 + 10'開始檢索50行的列表,即'2,147,483,657',它在'int'的有效範圍之外。因此,在這方面,不太可能使用'setFirstResults()'方法來設置,也就是說我可以**不**將這個值作爲參數傳遞給這個方法,比如''setFirstResults(2147483657)' - 這會報告編譯時錯誤。是否可以告訴Hibernate設置一個起始位置來檢索這樣的行子列表? – Tiny

相關問題