【问题标题】:jOOQ: best way to get aliased fields (from #as(alias, aliasFunction))jOOQ:获取别名字段的最佳方法(来自#as(alias,aliasFunction))
【发布时间】:2019-08-06 20:00:22
【问题描述】:

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

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&lt;Field&lt;?&gt;, String&gt; fooFieldAliasFunction = f -&gt; "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),但情况似乎并非如此。

当然,如果我想选择特定的字段,问题就会被放大......

我错过了什么吗?这样做的推荐方法是什么?

谢谢!

【问题讨论】:

    标签: java sql alias jooq


    【解决方案1】:

    我认为别名上会有一个方法可以直接为我提供别名字段(例如 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))
       ...
    ;
    

    【讨论】:

    • 感谢您的回答。由于我正在生成代码,这并不是什么大不了的事,只是觉得我可能错过了一些东西。你认为你可能会在 API 中添加这样的方法,例如Table#aliasedField(Field)(我意识到在内部,这会在语义上与 Table#getAliasedTable 冲突,但由于这不是 API,也许可以将其更改为 Table#getWrappedTable`,澄清一下)?
    • @Chris:这当然值得考虑,但还没有承诺:github.com/jOOQ/jOOQ/issues/8428
    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2015-06-06
    • 2023-03-06
    • 2013-06-18
    相关资源
    最近更新 更多