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

由于您仅从一个表中进行选择t1j,因此您可能能够<R extends Record>从该表中派生查询结果的行类型。

DSL.row(...)可以使用jOOQ 3.0 中引入的各种方法显式构造行类型:

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

然后,您可以使用该行类型来表达更安全的选择语句:

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 回答