jOOQ子选择中的Typesafe列

时间:2014-11-20 04:04:34

标签: java jooq

我有生成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);

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

你可以做的解决方法是创建以下不安全的,但保证工作帮助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