[英]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()帮助我以一种几乎不可知的方式查询表的存在而不会引发错误。 一些评论。
一个更不可知的方法是在存储库中定义一个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.