可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18

Kotlin ResultQuery收集器

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

jOOQ 的运行时 API 实现了一些有用的 Collectors,例如,可用于将数据提取到映射中

public class Records {

    // [...]

    public static final <K, V, R extends Record2<K, V>> Collector<R, ?, Map<K, V>> intoMap() {
        return intoMap(Record2::value1, Record2::value2);
    }

    // [...]

}

这些可以与 collect() 方法一起使用,如下所示

val map: Map<Int, String> =
create.select(LANGUAGE.ID, LANGUAGE.CD)
      .from(LANGUAGE)
      .collect(intoMap())

Collector 利用查询的类型安全,因此它仅适用于投影正好 2 列的查询。使用 kotlin 扩展模块,可以使用一些有用的扩展函数,如下所示

package org.jooq.kotlin

inline fun <reified E> ResultQuery<Record1<E>>.fetchArray(): Array<E> = collect(Records.intoArray(E::class.java))
fun <K, V, R : Record2<K, V>> ResultQuery<R>.fetchGroups(): Map<K, List<V>> = collect(Records.intoGroups())
fun <E, R : Record1<E>> ResultQuery<R>.fetchList(): List<E> = collect(Records.intoList())
fun <K, V> ResultQuery<Record2<K, V>>.fetchMap(): Map<K, V> = collect(Records.intoMap())
fun <E, R : Record1<E>> ResultQuery<R>.fetchSet(): Set<E> = collect(Records.intoSet())

这允许使用下面更简洁的版本

val map: Map<Int, String> =
create.select(LANGUAGE.ID, LANGUAGE.CD)
      .from(LANGUAGE)
      .fetchMap()

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo