2012-08-22 78 views
1

这是我的earlier关于在java中使用jooq与H2交互指定多重模式的问题的后续问题。查询适当的数据库模式

我的测试H2 DB目前有2个模式,PUBLIC和INFORMATION_SCHEMA。 PUBLIC被H2指定为默认模式。运行应从例如INFORMATION_SCHEMA.TABLES中提取信息的查询时,查询将失败并显示“表未知”SQL错误。我只能通过执行factory.use(INFORMATION_SCHEMA)来执行此类查询。没有生成错误等,并正确地自动完成例如TABLES.TABLE_NAME。

如果我不这样做,jooq似乎并不即使我创建正确厂对象的架构如

InformationSchemaFactory info = new InformationSchemaFactory(conn); 

我读到mapping预先设置适当的模式,但我有点困惑,哪些架构我会用作输入/输出。

回答

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和一个适当的模式映射来强制模式名称被渲染。

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

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

+0

选项1正是我一直在寻找,并感谢澄清一个给定的工厂假定连接它使用具有相同模式的连接。 – user1615803

+0

@ user1615803:是的,那个设计有点奇怪。我猜测它会在jOOQ 3.0中删除。到目前为止,它已经混淆了几个用户 –