2013-12-17 31 views
3

是否有可能通過編程方式知道哪個數據庫服務器在JPA中使用?我認爲,有一種方法,否則,JPA無法在運行時將JPQL轉換爲native query。我的程序也需要知道DB Server Type。該功能是否有任何功能?如何在JPA中以編程方式知道數據庫類型?

我用eclipseLink & jpa 2.0

我預期的計劃是:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA"); 
String dbPlatform = emf.getDBPlatform(); 
System.out.println(dbPlatform); 

輸出:

Oracle 
MySql 
MSSql 
DB2 
.... 
+0

JPA可以轉換JPQL,因爲您在使用的JPA實現中指定了數據庫方言(例如,在Hibernate中的「persistence.properties」中)。我不認爲有辦法可靠地找出你連接的數據庫類型。 –

+0

爲什麼你需要這些信息?如果你描述你的用例得到這些信息將不是必需的。我想有一種方法(eclipseLink必須與一些* JDBC驅動程序交談,你可以挖掘鏈接存儲的位置,並告訴它它是什麼類型)。 – mabi

+0

@mabi,我需要在運行時創建一個本地查詢,如果我不知道數據庫類型,我該如何創建本機查詢。 – CycDemo

回答

5

我從來不需要它,但我覺得要走的路是獲得JDBC connection並在其屬性中找到該inf ormation。特別是getClientInfo()getMetaData()可能很有趣。

這可能是實現特定的,但你說你使用的EclipseLink,您可以使用以下命令:

java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class); 

Reference from here.

PS:我覺得你要解決的問題野趣。

+1

我得到了我的預期結果'getMetaData()'函數。 Thz爲您的支持... – CycDemo

+0

我必須爲支持兩個不同數據庫的產品做同樣的事情。所以,當你編碼時,你不知道代碼將要查詢哪一個,並且當你需要執行本地SQL查詢時,這是根據你的db啓動正確的查詢的方法。 – Ali

+0

'connection.getMetaData()。getDatabaseProductName()'返回所需的結果,例如「Oracle」或「H2」 – Felk

相關問題