我有生成 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);
但是现在我丢失了所有的类型信息。
有没有更好的办法?
最佳答案
作为解决方法,您可以做的是创建以下不安全但保证有效的辅助 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 .
关于java - jOOQ 子选择中的类型安全列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27031550/