在JPA中,是否存在与DB无关的方法来检查表是否存在?

Dan*_*lan 6 java sql jpa eclipselink

我想知道是否有一种db不可知的方法来检查JPA中是否存在某个表(特别是eclipse链接).现在我们这样做的方式是使用这样的本机查询:

select count(*) from table_name where 1=2
Run Code Online (Sandbox Code Playgroud)

如果这会抛出异常,我们就知道该表不存在.而且,据我所知,这将适用于大多数SQL数据库.我没有的是它是一个hacky查询,并在表不存在时抛出SQL异常.我宁愿要能够做到这一点返回的查询true/ false而不是no error/ error.但我知道如何做的唯一方法是查询数据字典,这不会与数据库无关.

在JPA中,是否存在与DB无关的方法来检查表是否存在?

Eri*_*reg 2

我会将Joe Rinehart 的评论提升至回答级别。使用 DatabaseMetaData.getTables() 帮助我以一种几乎不可知的方式查询表的存在,而不会引发错误。一些评论。

  1. getTables 可能存在问题,例如Durandal指出的 Teradata 问题。
  2. 生成的表名大小写取决于数据库。例如,PostgreSQL 默认转换为小写,而 H2 默认转换为大写。

一种更不可知的方法是在存储库中定义计数方法,如下所示(其中 Todo 类是 JPA 实体)。

@org.springframework.stereotype.Repository
public interface TodoRepository extends Repository<Todo, Long> {
    Long count();
}
Run Code Online (Sandbox Code Playgroud)

上面的内容是不可知的,但会抛出必须捕获的错误,如下所示。

private long countTodos() {
    try {
        return todoRepository.count();
    } catch (Exception e) {
        getLogger().info("Count error: {}", e.getMessage());
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当不存在表时,错误也会显示在日志中。

2016-08-04 12:02:11.190  INFO 5788 --- [           main] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
2016-08-04 12:02:11.296  WARN 5788 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 42102, SQLState: 42S02
2016-08-04 12:02:11.296 ERROR 5788 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Table "TodosTable_name" not found; SQL statement:
select count(*) as col_0_0_ from "TodosTable_name" todo0_ [42102-192]
2016-08-04 12:02:11.303  INFO 5788 --- [           main] c.s.e.SpringJpaDemoApplicationTests      : Count error: could not prepare statement; SQL [select count(*) as col_0_0_ from "TodosTable_name" todo0_]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
Run Code Online (Sandbox Code Playgroud)

  • 存储库解决方案在启动时不会抛出错误吗?它看起来就像一个没有桌子的实体。 (2认同)