【问题标题】:How to know database type programmatically in JPA?如何在 JPA 中以编程方式了解数据库类型?
【发布时间】:2013-12-17 08:43:30
【问题描述】:

是否有可能以编程方式知道 JPA 中使用了哪个数据库服务器?我认为,有一种方法,否则 JPA 无法在运行时将 JPQL 转换为 native query。我的程序也需要知道DB Server Type。该功能有什么功能吗?

我使用eclipseLink & jpa 2.0

我预期的程序是:

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

输出:

Oracle
MySql
MSSql
DB2
....

【问题讨论】:

  • JPA 可以转换 JPQL,因为您在使用的 JPA 实现中指定了数据库方言(例如,在 Hibernate 中的 persistence.properties 中)。我认为没有办法可靠地找出您连接到哪种类型的数据库。
  • 为什么需要这些信息?如果您描述您的用例,则无需获取该信息。我想有一种方法(eclipseLink 必须与 some JDBC 驱动程序对话,您可能会挖掘该链接的存储位置并让它告诉您它是什么类型)。
  • @mabi,我需要在运行时创建一个原生查询,如果我不知道数据库类型,我该如何创建原生查询。
  • @CycDemo:为什么您需要在运行时创建本机查询?如果您描述了您要解决的根本问题,人们可以帮助您解决该问题。 (可能带有本机查询,也可能没有。)
  • @T.J.Crowder,我想通过使用原生查询来解决这个问题stackoverflow.com/questions/20625953/…

标签: java jpa eclipselink


【解决方案1】:

我从来不需要它,但我认为要走的路是获取JDBC connection 并在其属性中找到该信息。特别是getClientInfo()getMetaData() 可能会很有趣。

这可能是特定于实现的,但正如您所说您使用 EclipseLink,您可以使用以下内容:

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

Reference from here.

PS:我想你想解决一个有趣的问题。

【讨论】:

  • 我必须为支持两个不同数据库的产品做同样的事情。因此,当您编写代码时,您不知道代码将查询哪一个以及何时需要执行本机 SQL 查询,那么这是根据您的数据库触发正确的方法。
  • connection.getMetaData().getDatabaseProductName() 返回所需的结果,例如“Oracle”或“H2”
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多