簡體   English   中英

在JPA中,是否有數據庫不可知的方法來檢查表是否存在?

[英]In JPA, is there a DB agnostic way to check if a table exists?

我想知道是否有數據庫不可知的方式來檢查JPA中是否存在某個表(特別是eclipse鏈接)。 現在,我們的方法是使用本地查詢,如下所示:

select count(*) from table_name where 1=2

如果這引發異常,我們知道該表不存在。 而且據我所知,這將適用於大多數SQL數據庫。 我不想要的是它是一個hacky查詢,當表不存在時會引發SQL異常。 我希望能夠執行一個返回true / false而不是no error / error 但是我唯一知道的方法是查詢數據字典,而這與數據庫無關。

在JPA中,是否有數據庫不可知的方法來檢查表是否存在?

我將Joe Rinehart的評論提高到答案水平。 使用DatabaseMetaData.getTables()幫助我以一種幾乎不可知的方式查詢表的存在而不會引發錯誤。 一些評論。

  1. getTables可能有問題,例如Durandal指出的Teradata。
  2. 結果表名稱的大小寫取決於數據庫。 例如,PostgreSQL默認情況下轉換為小寫,而H2默認情況下轉換為大寫。

一個更不可知的方法是在存儲庫中定義一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM