2014-01-14 13 views
5

我想知道是否有一個數據庫不可知的方式來檢查JPA(特別是,eclipse鏈接)中是否存在某個表。現在我們這樣做的方式是使用像這樣的本地查詢:在JPA中,是否有一種DB不可知的方式來檢查表是否存在?

select count(*) from table_name where 1=2 

如果這將引發異常,我們知道該表不存在。而且,據我所知,這可以在大多數SQL數據庫上運行。我不這樣做是一個冒險的查詢,當表不存在時它會拋出一個SQL異常。我寧願能夠執行返回true/false而不是no error/error的查詢。但我知道如何做到這一點的唯一方法是查詢數據字典,這不會是數據庫不可知的。

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

+1

什麼是配置基礎連接(java.sql.Connection)? 你應該能夠到達它,獲得連接,然後執行connection.getMetaData()。這將返回一個DatabaseMetaData的實例,它有一個getTables()方法。它會返回一個ResultSet,然後您可以掃描。 –

+0

@JoeRinehart我只能猜測JPA是。我會看看你的建議是否有效。這篇文檔介紹瞭如何在JPA中獲得它:http://stackoverflow.com/a/3497206/61624 –

+2

@tieTYT我已經使用JPA之前的解包機制,它在過去爲我工作。對於大多數DB實現'getTables()'可以正常工作,但是我遇到了Teradata驅動程序的問題。出於某種原因'getTables()'不能正常工作,基本上從來沒有回來。只要驅動程序正確地執行'getTables()',你應該很好地使用JoeRinehart的建議。 – Durandal

回答

2

我會提高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 
+1

存儲庫解決方案在啓動時是否會引發錯誤?它看起來像一個沒有表格的實體。 –

相關問題