Java 在JPA中,是否有DB不可知的方法来检查表是否存在?
我想知道是否有一种db不可知的方法来检查JPA中是否存在某个表(特别是eclipse链接)。现在,我们使用的是本机查询,如下所示:Java 在JPA中,是否有DB不可知的方法来检查表是否存在?,java,sql,jpa,eclipselink,Java,Sql,Jpa,Eclipselink,我想知道是否有一种db不可知的方法来检查JPA中是否存在某个表(特别是eclipse链接)。现在,我们使用的是本机查询,如下所示: select count(*) from table_name where 1=2 如果抛出异常,我们知道该表不存在。而且,据我所知,这将适用于大多数SQL数据库。我不知道的是,这是一个黑客查询,当表不存在时,它会抛出一个SQL异常。我希望能够执行返回true/false的查询,而不是返回无错误/错误。但我知道如何做到这一点的唯一方法是查询数据字典,而这不会是数据
select count(*) from table_name where 1=2
如果抛出异常,我们知道该表不存在。而且,据我所知,这将适用于大多数SQL数据库。我不知道的是,这是一个黑客查询,当表不存在时,它会抛出一个SQL异常。我希望能够执行返回true
/false
的查询,而不是返回无错误
/错误
。但我知道如何做到这一点的唯一方法是查询数据字典,而这不会是数据库不可知的
在JPA中,是否有DB不可知的方法来检查表是否存在 我将提出评论以回答问题。使用DatabaseMetaData.getTables()可以帮助我以一种几乎不可知的方式查询表的存在,而不会引发错误。几点意见
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.sql.connection)的配置是什么?您应该能够访问它,获得连接,然后执行connection.getMetaData()。这将返回DatabaseMetaData的实例,该实例具有getTables()方法。它将返回一个结果集,您可以扫描它。@JoeRinehart我只能猜测JPA是。我看看你的建议是否有效。这篇文章记录了如何在JPA中获得它:@tieTYT我以前在JPA中使用过这种未包装的机制,它在过去对我很有效。对于大多数DB实现,
getTables()
工作正常,但我遇到了Teradata驱动程序的问题。由于某种原因,getTables()
无法正常工作,基本上再也没有回来过。只要驱动程序正确地实现了getTables()
,就可以使用JoeRinehart的建议。存储库解决方案不会在启动时抛出错误吗?它似乎是一个没有表的实体。
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