繁体   English   中英

Jooq 使用 r2dbc 驱动程序进行响应式获取

[英]Jooq reactive fetching using r2dbc driver

我的查询看起来像(使用 JOOQ v 3.15):

    override fun getCredentialsById(id: Long): Mono<UserCredentialsModel> {
    return Mono.from {
        dsl.select(
                USER_CREDENTIALS.ID,
                USER_CREDENTIALS.EMAIL,
                USER_CREDENTIALS.PHONE,
                USER_CREDENTIALS.LOGIN,
                USER_CREDENTIALS.PASSWORD)
            .from(USER_CREDENTIALS)
            .where(USER_CREDENTIALS.ID.eq(id))
            .and(USER_CREDENTIALS.IS_ACTIVE.eq(true))
            .fetchInto(UserCredentialsModel::class.java)
    }
}

JOOQ 配置:

@Bean
fun createContext(): DSLContext {
    return DSL.using(connection)
}

其中connectionio.r2dbc.spi.ConnectionFactory

我得到一个例外:

org.jooq.exception.DetachedException: Attempt to execute a blocking method (e.g. Query.execute() or ResultQuery.fetch()) when only an R2BDC ConnectionFactory was configured

然后我应该如何以反应式将我的查询结果提取到 Kotlin 数据类(或 Java JOOQ 的 POJO)中?

没有测试我会说它应该是

return Mono.from(
    dsl.select(
            USER_CREDENTIALS.ID,
            USER_CREDENTIALS.EMAIL,
            USER_CREDENTIALS.PHONE,
            USER_CREDENTIALS.LOGIN,
            USER_CREDENTIALS.PASSWORD)
        .from(USER_CREDENTIALS)
        .where(USER_CREDENTIALS.ID.eq(id))
        .and(USER_CREDENTIALS.IS_ACTIVE.eq(true)));

当被动地使用 jOOQ 时,你不应该调用任何阻塞方法,比如ResultQuery.fetchOneInto(Class) 该方法只是ResultQuery.fetchOne()Record.into(Class)的便捷方法。 没有什么能阻止你自己调用Record.into(Class) ,无论是在阻塞世界还是非阻塞世界。

因此,使用您常用的反应器库方法来映射流内容:

mono.map { r -> r.into(UserCredentialsModel::class.java) }

或者,在一个完整的例子中:

return Mono.from {
    dsl.select(
            USER_CREDENTIALS.ID,
            USER_CREDENTIALS.EMAIL,
            USER_CREDENTIALS.PHONE,
            USER_CREDENTIALS.LOGIN,
            USER_CREDENTIALS.PASSWORD)
        .from(USER_CREDENTIALS)
        .where(USER_CREDENTIALS.ID.eq(id))
        .and(USER_CREDENTIALS.IS_ACTIVE.eq(true))
} .map { r -> r.into(UserCredentialsModel::class.java) }

你可以试试 .toMono().subscribe()

dsl.select(
            USER_CREDENTIALS.ID,
            USER_CREDENTIALS.EMAIL,
            USER_CREDENTIALS.PHONE,
            USER_CREDENTIALS.LOGIN,
            USER_CREDENTIALS.PASSWORD)
        .from(USER_CREDENTIALS)
        .where(USER_CREDENTIALS.ID.eq(id))
        .and(USER_CREDENTIALS.IS_ACTIVE.eq(true))
        .fetchInto(UserCredentialsModel::class.java)
        .toMono().subscribe()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM