java - jOOQ 子选择中的类型安全列

标签 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);

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

有没有更好的办法?

最佳答案

作为解决方法,您可以做的是创建以下不安全但保证有效的辅助 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/

相关文章:

java - 所选项目的 Android Spinner 用户交互

java - RxJava just() 计算线程

java - 如何轻松地求和两个 hashMap<String,Integer>?

java - 无法使用 Jooq 执行 PostgreSQL 函数

java - jOOQ 中按日历周分组

java - JOOQ fetchLazy 进入 POJO

java - 处理 NumberFormatException 的最佳实践

java - java api 中的短语建议器整理查询

mysql - 为什么我在使用 JOOQ 时会一次性恢复日期?

gradle - 新的 jooq/gradle 配置不生成任何 jooq 类