如何检查jOOQ中是否存在表?

HRJ*_*HRJ 5 java sql h2 jooq

打开数据库连接后,我想检查数据库是否是新创建的。我正在使用 H2,如果一个数据库不存在,它会自动创建一个数据库。

我试过这个检查:

db.Public.PUBLIC.getTables().isEmpty()

但这会返回一个静态表列表(不查询数据库中的架构)。

我可以编写原始 SQL 来获取表列表,但这将特定于数据库引擎。jOOQ 中有通用的替代方案吗?

Luk*_*der 5

您不能使用:

db.Public.PUBLIC.getTables().isEmpty()
Run Code Online (Sandbox Code Playgroud)

因为生成的元信息没有连接到数据库。相反,您可能需要查看DSLContext.meta(). 在您的情况下,您只需编写:

DSL.using(configuration).meta().getTables().isEmpty();
Run Code Online (Sandbox Code Playgroud)

如果您经常运行此测试,这当然不是检查是否有任何表的高效方法,因为它会将所有表提取到内存中只是为了运行isEmpty()检查。我建议改为发出实际查询:

int numberOfTables =
DSL.using(configuration)
   .select(count())
   .from("information_schema.tables")
   .where("table_schema = 'PUBLIC'")
   .fetchOne(0, int.class);
Run Code Online (Sandbox Code Playgroud)

未来的 jOOQ 版本(3.11 之后)将能够为您提供可在 SQL 或其他地方使用的实际对象存在谓词:

https://github.com/jOOQ/jOOQ/issues/8038