在jOOQ中保留别名字段的类型信息

时间:2013-10-28 15:07:46

标签: java sql jooq

我正在使用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"

1 个答案:

答案 0 :(得分:1)

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

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

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,因此您无法使用行类型。