java - 在 JPA 中,是否有一种与数据库无关的方法来检查表是否存在?

标签 java sql jpa eclipselink

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

select count(*) from table_name where 1=2

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

在 JPA 中,是否有一种与数据库无关的方法来检查表是否存在?

最佳答案

我会提高 Joe Rinehart's评论回答水平。使用 DatabaseMetaData.getTables() 帮助我以几乎不可知的方式查询表的存在,而不会引发错误。一些评论。

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

一种更不可知的方法是在存储库中定义一个计数方法,如下所示(其中 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

关于java - 在 JPA 中,是否有一种与数据库无关的方法来检查表是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21125385/

相关文章:

java - 如何使用 spring-data-rest 和 MockMvc 创建用于集成测试的 JSON

java - 形状对象不接受输入的坐标

mysql - 从与父表具有外键约束的子表中删除记录的成本是多少

java - 当我从 CDI 支持 bean 调用 EJB Dao 时,返回实体中的 @OneToMany 集合将被清除并为空

java - JPA:具有复合主键和单键的实体映射

java - JComponent 不会重绘

java - 计算复活节星期天的日期

SQL:查找表中缺失的 ID

sql - rails : group and count sql query include zero's

mysql - mysql中的用户队列