Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中,是否有DB不可知的方法来检查表是否存在?_Java_Sql_Jpa_Eclipselink - Fatal编程技术网

Java 在JPA中,是否有DB不可知的方法来检查表是否存在?

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的查询,而不是返回无错误/错误。但我知道如何做到这一点的唯一方法是查询数据字典,而这不会是数据

我想知道是否有一种db不可知的方法来检查JPA中是否存在某个表(特别是eclipse链接)。现在,我们使用的是本机查询,如下所示:

select count(*) from table_name where 1=2
如果抛出异常,我们知道该表不存在。而且,据我所知,这将适用于大多数SQL数据库。我不知道的是,这是一个黑客查询,当表不存在时,它会抛出一个SQL异常。我希望能够执行返回
true
/
false
的查询,而不是返回
无错误
/
错误
。但我知道如何做到这一点的唯一方法是查询数据字典,而这不会是数据库不可知的

在JPA中,是否有DB不可知的方法来检查表是否存在

我将提出评论以回答问题。使用DatabaseMetaData.getTables()可以帮助我以一种几乎不可知的方式查询表的存在,而不会引发错误。几点意见

  • getTables可能有问题,例如,正如所指出的Teradata
  • 结果表名大小写依赖于数据库。例如,PostgreSQL默认转换为小写,而H2默认转换为大写
  • 一种更不可知的方法是在存储库中定义count方法,如下面所示(其中Todo类是JPA实体)

    当不存在表时,日志中也会显示错误

    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