我必须从“根”表访问同一个表以获取多个引用。为了做到这一点,我正在为这些表创建别名:
protected final Table<XyzRecord> foo = Tables.XYZ.as("foo", <foo-alias-function>);
protected final Table<XyzRecord> bar = Tables.XYZ.as("bar", <bar-alias-function>);
bar-alias-function
将声明如下_
protected final Function<Field<?>, String> fooFieldAliasFunction = f -> "foo_" + f.getName();
既然我想从类型安全查询中受益,我需要在查询中重复使用相同的alias-function
来访问字段:
jooq.select()
.from (root)
.leftJoin(foo).on(
checklistTarget.field(fooFieldAliasFunction.apply(Tables.XYZ.ID), Tables.XYZ.ID.getType())
.eq(root.FOO_ID)
)
.leftJoin(bar).on(
checklistTarget.field(barFieldAliasFunction.apply(Tables.XYZ.ID), Tables.XYZ.ID.getType())
.eq(root.BAR_ID)
)
...
;
这看起来非常笨拙(很多代码)并且效率不高(因为别名字段名称可能与别名表一起存储)。
我假设在别名上会有一个方法直接给我一个别名字段(例如foo.getField(Tables.XYZ.ID)
,但似乎并非如此。
当然,如果我想选择特定字段,问题会被放大......
我错过了什么吗?建议的方法是什么?
谢谢!
我假设在别名上会有一个方法直接给我一个别名字段(例如foo.getField(Tables.XYZ.ID),但似乎并非如此。
这种API确实很有用,尽管现有的Table.field(Field)
方法不应该被改装以承担这种行为。可能会引入一种新方法。另一方面,您可以编写一个简单的实用程序:
<T, R extends Record> Field<T> field(Table<R> table, TableField<R, T> field) {
if (table == foo)
return foo.field(fooFieldAliasFunction.apply(field), field.getType());
else if (table == bar)
return foo.field(barFieldAliasFunction.apply(field), field.getType());
else
throw IllegalArgumentException();
}
然后像这样调用它:
jooq.select()
.from (root)
.leftJoin(foo).on(field(foo, XYZ.ID).eq(root.FOO_ID))
.leftJoin(bar).on(field(bar, XYZ.ID).eq(root.BAR_ID))
...
;