jOOQ:获取别名字段的最佳方法(从#as(alias,aliasFunction))

时间:2019-03-15 17:14:43

标签: java sql alias jooq

我必须从“根”表访问同一表以获取多个引用。为此,我为这些表创建别名:

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),但事实并非如此。

如果我要选择特定的字段,那么问题当然会放大……

我想念什么吗?建议这样做的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

  

我假设别名上会有一个方法,可以直接给我别名字段(例如foo.getField(Tables.XYZ.ID),但事实并非如此。

尽管不应该对现有的Table.field(Field)方法进行改造以假定这种行为,但这种API确实会有用。可能会引入一种新方法。另一方面,您可以编写一个简单的实用程序:

<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))
   ...
;