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

时间:2014-01-14 22:29:34

标签: java sql jpa eclipselink

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

select count(*) from table_name where 1=2

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

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

1 个答案:

答案 0 :(得分:2)

我会提出Joe Rinehart's评论来回答问题。使用DatabaseMetaData.getTables()帮助我以一种主要不可知的方式查询表的存在而不会引发错误。几条评论。

  1. getTables可能存在问题,例如Durandal指出的Teradata。
  2. 生成的表名称大小写与数据库有关。例如,PostgreSQL默认转换为小写,而H2默认转换为大写。
  3. 更不可知的方法是在存储库中定义count方法,例如以下(其中Todo类是JPA实体)。

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

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

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

    当没有表格时,错误也会显示在日志中。

    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