2014-01-21 14 views
2

我正在使用JPA(Hibernate)的項目,所以幾乎所有的查詢都是用JPQL編寫的。但是對於需要查詢特定數據庫類型的查詢,我寫了一個本機查詢。不同的數據庫,不同的結果類型與'SELECT 1'通過jdbc:如何檢查值?

該項目實際上是用MySQL和Oracle DBMS測試的。我的本機查詢是"SELECT 1 FROM [...]";然後我需要知道結果是否存在(簡單),如果它是1(你可能會認爲這是簡化,我猜:-))。

在這兩種情況下,我將創建一個javax.persistence.QuerycreateNativeQuery(String),然後我運行如下查詢:Object r = q.getSingleResult();(例外情況已被處理)。
我發現在MySQL上r是BigInteger,而在Oracle中是BigDecimal

我是一個nood在JDBC,有沒有什麼辦法(改變查詢,對象或方法調用我使用),我可以肯定,我的查詢將返回相同的數據類型,無論數據庫系統是針對?這是可以配置的東西,依賴於jdbc,還是一個驅動程序特定的問題?

回答

1

BigIntegerBigDecimal都是Number的子類。因此,只需轉換爲常用的超類型並使用它的方法將其轉換爲基本類型,如int

Number r = (Number) q.getSingleResult(); 
boolean isOne = (r.intValue() == 1); 

Hibernate也具有非常有用addScalar方法。請查看其文檔的Chapter 18以獲取更多信息。

如果您決定使用此解決方案,請記住,這意味着您展開JPA層和應用供應商特定API:

Session session = entityManager.unwrap(Session.class); 
Integer r = (Integer) session.createSQLQuery("SELECT 1 AS one FROM [...]") 
    .addScalar("one", IntegerType.INSTANCE) 
    .uniqueResult(); 

最後,JPA擁有自己SqlResultSetMapping註釋。有了它,你可以將你的本地結果包裝在一個實體中。 JPA提供程序將盡最大努力將每個數據庫列轉換爲其各自的實體字段類型。儘管如此,對於標量值來說,開銷太大(我會選擇第一種解決方案)。

+1

謝謝!有時我只是忘了OOP :-) – watery

相關問題