講解Hibernate query語(yǔ)句
Hibernate還是比較常用的,于是我研究了一下Hibernate query語(yǔ)句,在這里拿出來(lái)和大家分享一下,希望對(duì)大家有用。
今天要在sqlserver環(huán)境下做一個(gè)簡(jiǎn)單的增刪改功能,要用到分頁(yè),開始直接用oracle數(shù)據(jù)庫(kù)環(huán)境一直用的一個(gè)jdbc重構(gòu)過的類處理,發(fā)現(xiàn)不行,才想起oracle和sqlserver的分頁(yè)sql語(yǔ)句寫法是很不一樣的,于是打算google一下,緊接又想,何不先看看Hibernate在sqlserver環(huán)境是怎么處理分頁(yè)的(我這里用的是Hibernate 3.0)。
先把Hibernate配置文件的show_sql改成true,啟動(dòng)tomcat,在項(xiàng)目原來(lái)的一個(gè)功能里找到一個(gè)翻頁(yè)的地方,比如每頁(yè)顯示兩條,***頁(yè)的時(shí)候,Hibernate query語(yǔ)句是:SELECT TOP 2 * FROM …… 恩,對(duì)的,看來(lái)Hibernate還比較聰明,***頁(yè)直接用top語(yǔ)句,可是點(diǎn)下一頁(yè),當(dāng)查詢的記錄應(yīng)是3-4條時(shí),Hibernate query語(yǔ)句是: SELECT TOP 4 * FROM…… 不理解了,難道Hibernate這么笨嗎,如果我要查的是第100萬(wàn)條到100萬(wàn)零10條的記錄,難道他也是先把這100萬(wàn)零10條全部查出來(lái)嗎?
但是我測(cè)試的結(jié)果就是如果我要去第5000頁(yè)的數(shù)據(jù),他就是select top 10000 * from ……這樣取出來(lái)的。但是如果把sql dialect 改成oracle,處理是用 rownum 直接去取需要的中間那么多條記錄的。明天升級(jí)到***的Hibernate 3.3試試看會(huì)不會(huì)這樣。難道java的開源框架對(duì)sql server這么感冒? 呵呵
監(jiān)控了下數(shù)據(jù)庫(kù),發(fā)現(xiàn)公司的php程序在翻頁(yè)時(shí)也是這樣處理的,我就奇怪了,sql server2005中也有rownum概念的啊。看來(lái)代碼從sql server2000到2005以后還是要做一些優(yōu)化的
【編輯推薦】