我有生成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);
但现在我丢失了所有类型信息。
有更好的方法吗?
答案 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。