2012-05-11 43 views
5

我在數據庫(Derby和DB2)兩大Integer列。我需要在JPQL之內將它們相互分開。如何在JPQL語句中使用typcasting?

Integer這兩列都是零,如果餘數是十進制數,例如0.25等於0等,並且可以理解,因爲類型是int。

SQL我能有這個例如

select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2))from Sometable;

但什麼是JPQL等同。

一種選擇可能是(我還沒試過)是擁有在實體@Transient方法返回小數類型,這樣計算存在並傳遞至JPQL但我寧願讓SQL做這項工作。


Mysql不需要在數據庫級別進行轉換。所以對於不同的RDBMS行爲是不同的,這很好。但是JPQL應該怎麼做呢,不需要使用本地查詢來知道該操作需要轉換爲十進制。

添加方言<property name="openjpa.jdbc.DBDictionary" value="derby"/>沒有任何解決它。

請注意這是JPA1

回答

2

您有三個基本選項。

  1. 使用負荷後,讓Java的做。
  2. 使用第三類,並使用new運算符JPQL 的SELECT語句來調用構造和內部調用,您可以管理 數據類型將被傳遞到SQL,但你會得到更多然後一個 類型的對象的後面是罰款只是從右邊 陣列索引得到正確的一個。更多在這here
  3. 三使用原生查詢像Idanmo說。
2

AFAIK沒有辦法做這樣的投在JPQL的。

我建議使用JPA的本地查詢執行,它可以讓你喜歡你,如果你正在使用JDBC運行SQL查詢。

例如:

Query query = em.createNativeQuery("select CAST(column1 as decimal(6,2))/CAST(column2 as decimal(6,2)) from Sometable"); 

Double result = (Double) query.getSingleResult(); 

List<Double> results = (List<Double>) query.getResultList(); 
+0

我會期望div /運算符返回一個小數而不需要轉換,但那不會發生。也設置方言應該/應該照顧這可能是但不是這樣的情況。我也傾向於nativeQuery,但我仍然不相信它不僅是選擇。如果這真的是那種傷心。 +1。 – Shahzeb

+0

你能否詳細說明你爲什麼期望方言自動進行鑄造? – Victor

+0

@Kaushik因爲兩個整數的劃分根據底層數據庫產生不同的數據類型。例如,'Mysql'返回一個小數,例如將'0.25'改爲'0'的'Derby'和'DB2'整數。因此,方言必須知道行爲並提供機械,尤其是考慮到'JPQL'中沒有可用的演員選項。 – Shahzeb

3

即除法運算符執行整數除法上的整數參數是一個特徵。在MySQL中,你必須明確地選擇div整數除法和/用於浮點除法,而在JPQL選擇是自動進行的,就像在Java中。

所以我建議:

select (column1 * 1.0)/column2 from Sometable;