2014-11-21 20 views
0

我使用Hibernate的方法uniqueResult()來獲取記錄的計數表中的編寫自定義HSQLDialect改變Hibernate的返回類型uniqueResult()

"SELECT COUNT(*) AS C FROM TABLE"; 

在測試中,我們使用HSQLDB的內存或localhost數據庫和uniqueResult()返回count(*)的java.math.BigInteger。但是在真實環境中,我們使用DB2,其中uniqueResult()返回java.lang.Integer。所以,當我跑我的測試中,我得到一個ClassCastException java.math.BigInteger cannot be cast to java.lang.Integer以下代碼:

SQLQuery q = getSession(false).createSQLQuery(query); 
Integer count = (Integer) q.uniqueResult(); 

有一個修復,我發現通過添加addScalar()方法來指定返回類型:

SQLQuery q = getSession(false).createSQLQuery(query).addScalar("C", Hibernate.INTEGER); 

但有沒有一種方法可以使全局的返回類型更改的默認行爲?也許通過編寫一個自定義的HSQLDialect來指定所有計數值作爲整數返回?

回答

0

嘗試使用select count(somecolumn)而不是select count(*)。您可能會發現返回的數據類型對於兩個數據庫都是相同的類型。我認爲返回的類型與計數表達式中使用的列的類型有關。

+0

嗯,它似乎仍然返回一個BigInteger,我得到了同樣的錯誤。另外,我寧願將*保留在那裏,因爲我們的列名可以改變。即使當我計算(1)它仍然作爲BigInteger回來 – Sivan 2014-11-21 14:51:01

+1

使用可以嘗試轉換爲java.lang.Number,然後使用intValue或longValue方法。 – 2014-11-21 15:52:24

+0

好,所以這個工作,謝謝。但問題是,它與我在添加「addScalar()」時發現的修復相似,因爲它要求您嚴格修改代碼以用於測試目的。我讀了「編寫測試代碼」的不好做法。 所以我實際上正在尋找一種方法來調整測試代碼,以便它可以處理生產代碼而不是反之亦然。也許調整方言可以做到這一點,但對我來說這是陌生的領域。 – Sivan 2014-11-26 16:44:30