1

这是我之前关于在 java 中使用 jooq 与 H2 交互指定多个模式的问题的后续问题。

我的测试 H2 DB 目前有 2 个模式,PUBLIC 和 INFORMATION_SCHEMA。PUBLIC 被 H2 指定为默认模式。当运行一个应该从例如 INFORMATION_SCHEMA.TABLES 中提取信息的查询时,查询失败并出现“表未知”SQL 错误。我只能通过执行一个factory.use(INFORMATION_SCHEMA). 没有构建错误等,并且 Eclipse 可以正确地自动完成,例如 TABLES.TABLE_NAME。

如果我不这样做,即使我为模式创建了正确的工厂对象,jooq 似乎也不会预先添加适当的模式,例如

InformationSchemaFactory info = new InformationSchemaFactory(conn);

我阅读了有关映射的信息,但对于我将使用哪个模式作为输入/输出感到有点困惑。

4

1 回答 1

2

默认情况下,InformationSchemaFactory假定提供的连接实际连接到INFORMATION_SCHEMA. 这就是为什么模式名称不在 SQL 中呈现的原因。例子:

// This query...
new InformationSchemaFactory(conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch();

// ... renders this SQL (with the asterisk expanded):
SELECT * FROM "TABLES";

上述行为应记录在您生成的InformationSchemaFactoryJavadoc 中。为了在前面"TABLES"加上"INFORMATION_SCHEMA",您有几个选择。

  1. 改用常规工厂,它不依赖于任何模式:

    // This query...
    new Factory(H2, conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch();
    
    // ... renders this SQL:
    SELECT * FROM "INFORMATION_SCHEMA"."TABLES";
    
  2. 使用另一个模式的工厂,例如生成的PublicFactory

    // This query...
    new PublicFactory(conn).selectFrom(INFORMATION_SCHEMA.TABLES).fetch();
    
    // ... renders this SQL:
    SELECT * FROM "INFORMATION_SCHEMA"."TABLES";
    
  3. 使用设置和适当的模式映射来强制呈现模式名称。

第一个选项可能是最简单的一个。

这篇博文将让您深入了解如何将执行的查询记录到您首选的记录器输出:http ://blog.jooq.org/2011/10/20/debug-logging-sql-with-jooq/

于 2012-08-22T10:36:41.970 回答