【问题标题】:Typesafe columns in jOOQ subselectjOOQ 子选择中的类型安全列
【发布时间】:2014-11-22 01:12:46
【问题描述】:

我有生成 jOOQ Select 对象的代码,我需要将其用作更复杂查询的一部分。

这样的工作:

Select<Record3<Long, Integer, BigDecimal>> s = getFromSomewhere();
Field<?>[] f = s.fields();

// use it in a sub-select
Select<Record2<?,?>> x = DSL.select(f[0], f[1]).from(s);

但现在我丢失了所有类型信息。

有没有更好的办法?

【问题讨论】:

标签: java jooq


【解决方案1】:

您可以做的一种解决方法是创建以下不安全但保证可以工作的辅助 API:

public static <T1, T2, T3> Row3<T1, T2, T3> row3(Select<Record3<T1, T2, T3>> select) {
    return (Row3) DSL.row(select.field(1), select.field(2), select.field(3));
}

或者,如果您想押注 jOOQ 的内部结构,这也可以:

public static <T1, T2, T3> Row3<T1, T2, T3> row3(Select<Record3<T1, T2, T3>> select) {
    (Row3<T1, T2, T3>) select.fieldsRow();
}

需要后缀3,因为没有后缀,你不能重载不同的row方法,因为泛型类型擦除,记录程度不同。

这一行确实可以这样使用:

Select<Record3<Long, Integer, BigDecimal>> s = getFromSomewhere();
Row3<Long, Integer, BigDecimal> row = row3(s);

// use it in a sub-select
Select<Record2<Long, Integer>> x = DSL.select(row.field1(), row.field2()).from(s);

我还将将此注册为 jOOQ 3.6.0 的功能请求:#3796

【讨论】:

    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2020-06-16
    相关资源
    最近更新 更多