1

これは、jooqを使用してH2と対話するためにJavaで複数のスキーマを指定することについての私の以前の質問に続く質問です。

私のテストH2DBには、現在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);

マッピングについて読みましたが、どのスキーマを入力/出力として使用するかについて少し混乱しています。

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 に答える