我正在使用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"
答案 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,因此您无法使用行类型。