这是我的 earlier 的后续问题关于使用 jooq 在 java 中指定多个模式与 H2 交互的问题。
我的测试 H2 DB 目前有 2 个模式:PUBLIC 和 INFORMATION_SCHEMA。 PUBLIC 被 H2 指定为默认模式。当运行应从 INFORMATION_SCHEMA.TABLES 等提取信息的查询时,查询会失败并出现“表未知”SQL 错误。我只能通过执行 factory.use(INFORMATION_SCHEMA)
来执行此类查询。没有构建错误等,并且 Eclipse 可以正确自动完成,例如 TABLES.TABLE_NAME。
如果我不这样做,即使我为架构创建了正确的 Factory 对象,jooq 似乎也不会预先添加适当的架构,例如
InformationSchemaFactory info = new InformationSchemaFactory(conn);
我读到了mapping但对于我将使用哪种模式作为输入/输出有点困惑。
最佳答案
默认情况下,InformationSchemaFactory
假定提供的连接实际上连接到 INFORMATION_SCHEMA
。这就是模式名称不在 SQL 中呈现的原因。示例:
// This query...
new InformationSchemaFactory(conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch();
// ... renders this SQL (with the asterisk expanded):
SELECT * FROM "TABLES";
上述行为应记录在您生成的 InformationSchemaFactory
Javadoc 中。为了在 "TABLES"
前面添加 "INFORMATION_SCHEMA"
,您有多种选择。
改用常规工厂,它不与任何架构绑定(bind):
// This query... new Factory(H2, conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch(); // ... renders this SQL: SELECT * FROM "INFORMATION_SCHEMA"."TABLES";
使用另一个模式的工厂,例如生成的
PublicFactory
:// This query... new PublicFactory(conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch(); // ... renders this SQL: SELECT * FROM "INFORMATION_SCHEMA"."TABLES";
使用Settings以及适当的架构映射以强制呈现架构名称。
第一个选项可能是最简单的。
这篇博文将让您深入了解如何将执行的查询记录到您的首选记录器输出:http://blog.jooq.org/2011/10/20/debug-logging-sql-with-jooq/
关于java - 查询适当的数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12070934/