1

jOOQを使用して結合クエリを実行しています。列名を一意に保つために、両方のテーブルの列にエイリアスを設定する必要があります。

列にエイリアシングを行うときに発生する情報の損失を回避する方法はありますか? または、jOOQ のスタイルに従って、列名の競合という目標を達成するためのより良い方法はありますか?

すべてのフィールドにエイリアスを設定すると、すべての型情報が失われます。

List<Field<?>> columns = factory.select().from(t1j).limit(0).fetch().getFields();
List<Field<?>> aliases = new LinkedList<Field<?>>();
for (Field f : columns) {
    Field alias = Factory.fieldByName(t1j.getName(), f.getName())
                         .as(f.getName() + "_t1");
    aliases.add(alias);
}

// columns.get(0).getType() == "class java.lang.String"
// aliases.get(0).getType() == "class java.lang.Object"
4

1 に答える 1

1

1 つのテーブルからのみ選択しているため、そのテーブルからクエリ結果t1jの行タイプを取得できる場合があります。<R extends Record>

行型はDSL.row(...)、jOOQ 3.0 で導入されたさまざまなメソッドを使用して明示的に構築できます。

Row2<Integer, String> row = DSL.row(INT_FIELD, STRING_FIELD);

次に、その行タイプを使用して、よりタイプセーフな select ステートメントを表現できます。

Result<Record2<Integer, String>> result =
DSL.using(configuration)
   .select(row.field1().as("f1"), row.field2().as("f2"))
   .from(t1j)
   .limit(0)
   .fetch();

jOOQ 2.x を使用しているように見えるため、行タイプはまだ利用できないことに注意してください。

于 2013-10-29T08:41:41.607 に答える