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

Kotlin MULTISET收集器

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

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

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);
    }

    // [...]

}

这些可以与 MULTISETMULTISET_AGG 一起使用,如下所示

val map: Field<Map<Int, String>> =
multisetAgg(LANGUAGE.ID, LANGUAGE.CD).convertFrom { r -> r.collect(Records.intoMap()) }

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

package org.jooq.kotlin

inline fun <reified E> Field<Result<Record1<E>>>.intoArray(): Field<Array<E>> = collecting(Records.intoArray(E::class.java))
fun <K, V, R : Record2<K, V>> Field<Result<R>>.intoGroups(): Field<Map<K, List<V>>> = collecting(Records.intoGroups())
fun <E, R : Record1<E>> Field<Result<R>>.intoList(): Field<List<E>> = collecting(Records.intoList())
fun <K, V> Field<Result<Record2<K, V>>>.intoMap(): Field<Map<K, V>> = collecting(Records.intoMap())
fun <E, R : Record1<E>> Field<Result<R>>.intoSet(): Field<Set<E>> = collecting(Records.intoSet())

// [... and more]

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

val map: Field<Map<Int, String>> =
multisetAgg(LANGUAGE.ID, LANGUAGE.CD).intoMap()

反馈

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

The jOOQ Logo