查询相应的数据库架构

时间:2012-08-22 10:15:15

标签: java schema h2 information-schema jooq

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

我的测试H2数据库目前有2个模式,PUBLIC和INFORMATION_SCHEMA。 H2将PUBLIC指定为默认架构。当运行应从例如INFORMATION_SCHEMA.TABLES提取信息的查询时,查询失败并出现“表未知”SQL错误。我只能通过执行factory.use(INFORMATION_SCHEMA)来执行此类查询。没有构建错误等,并且eclipse正确地自动填充,例如TABLES.TABLE_NAME。

如果我不这样做,即使我为模式创建了正确的Factory对象,jooq似乎也不会在前面添加适当的模式,例如

InformationSchemaFactory info = new InformationSchemaFactory(conn);

我读到了mapping,但对于我将用作输入/输出的模式有点困惑。

1 个答案:

答案 0 :(得分: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";

应在生成的InformationSchemaFactory Javadoc中记录上述行为。要将"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. 使用Settings和相应的架构映射来强制渲染架构名称。

  4. 第一种选择可能是最简单的选择。

    此博客文章将为您提供有关如何将执行的查询记录到首选记录器输出的一些见解:http://blog.jooq.org/2011/10/20/debug-logging-sql-with-jooq/