如何通过Hibernate获取数据库版本?

3
有没有一种方式可以通过Hibernate 3.2 API获取底层数据库版本的一些信息?我在这里和javadoc上都没有找到相关的内容。
4个回答

2
获取数据库引擎版本是与具体实现相关的。这意味着没有共享的方法来获取版本,因此Hibernate无法提供API,因为它不绑定到任何特定的RDBMS。例如,以下是从一些知名的RDBMS使用SELECT语句获取版本的不同方式:
  • Oracle: SELECT * FROM v$version;
  • SQL Server: SELECT @@version
  • MySQL: SELECT VERSION()
  • ...
您可以创建一个报告版本的视图,然后将其添加到ORM中,这样就可以像任何其他Hibernate对象一样访问它。

非常感谢您提供如此详细的解释。我会尝试您提出的方法。这应该很容易,因为我只需要支持Oracle和MySQL。 - Yining

0

通过一些解包可能实现:

Session hibSession = ... // session is taken from wherever is possible
String dbVersion = hibSession.unwrap(SharedSessionContractImplementor.class)
    .getJdbcCoordinator()
    .getLogicalConnection()
    .getPhysicalConnection()
    .getMetadata()
    .getDatabaseProductVersion();

还有可用于主/次版本的单独方法,以及JDBC协议版本、DB供应商名称等。


0
一个比被接受的答案更简单的方法是使用java.sql.DatabaseMetaData类:
    try (Session session = sessionFactory.openSession()) {
        session.doWork(connection -> {
            DatabaseMetaData metaData = connection.getMetaData();
            System.out.println("Product version: " + metaData.getDatabaseProductVersion());
            System.out.println("Major version: " + metaData.getDatabaseMajorVersion());
            System.out.println("Minor version: " + metaData.getDatabaseMinorVersion());
         });
     }

对于我的MySQL 5.5实例,这将输出:

Product version: 5.5.62-log
Major version: 5
Minor version: 5

产品版本与 SELECT VERSION() 返回的值相同。


0
public static void testConnection() {
    Session session = null;
    try {
        session = getSessionFactory().openSession();
        session.doWork(connection -> {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT VERSION()");
            resultSet.next();
            System.out.println("DB test: " + resultSet.getString(1));
        });
    } finally {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接