我想将jOOQ与Kotlin Coroutines一起使用,但我找不到文档或示例代码来了解如何正确使用它.

我想 Select 与我的查询匹配的所有行,并将它们映射到我的POJO中.

我试过各种组合.fetchAsync听起来正确,但映射后返回类型不正确

Incorrect return type of 100

open suspend fun findAll(): Flow<Model> {
    return ctx.select()
        .from(table)
        .fetchAsync()
        .await()
        .into(modelClass)  // Into is blocking
}

如果我想阻止它,我可以使用:

return ctx.select()
    .from(table)
    .fetchInto(modelClass)

但没有百分百的方法.

此外,如果我想要执行一个EXISTS查询,我可以看到它是如何通过阻塞来完成的,但不是异步的.

例如

ctx.fetchExists(dslContext.selectFrom(table).where(YOUR_TABLE.ID.eq(id))

如何使用带有Kotlin Coroutines的jOOQ执行SELECT ALL AND EXISTS查询?

Update个 我可以用熔剂来解决这个问题.

Flux.from(ctx.select().from(table))
.map { record -> record.into(modelClass) }
.asFlow()

Exists query update

这会成功运行,但不会直接运行EXISTS查询.

val result =  ctx.selectFrom(table)
    .where(USER_MODEL.EMAIL.eq(email))
    .awaitFirstOrNull()

    return result != null

我试着这样写查询,但它抛出了一个Cannot execute query. No JDBC Connection configured异常:

select(
    exists(
        ctx.selectFrom(table)
           .where(USER_MODEL.EMAIL.eq(email))
    )
).awaitFirst().into(Boolean::class.java)

推荐答案

jOOQ 3.17开始,jooq-kotlin-coroutines扩展模块允许在react 流API和协程API之间桥接.

并且您必须向项目添加下一个依赖项

<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>jooq-kotlin-coroutines</artifactId>
  <version>version</version>
</dependency>

要了解更多详细信息,请查看Kotlin coroutine support

Update

您的查询应该是下一个查询 pseudocode

Flux.from(
     ctx.select()
     .from(table)
     .fetchInto(modelClass)
  ) 
  .asFlow()

Kotlin相关问答推荐

如何访问方法引用的接收者?

Kotlin stlib中是否有用于将列表<;对<;A,B&>;转换为对<;列表<;A&>,列表<;B&>;的函数

如何在Docker中使用Selenium和chromedriver?

仅某些用户出现 DateTimeFormatter 错误

kotlin中如何使用子类调用父静态方法?

如何在 Kotlin 中为类方法调用传递变量

在 Kotlin 协程中切换 IO 和 UI 的正确方法是什么?

为什么 Kotlin 在 sumOf 函数 lambda 中默认不将数字视为Int?

Kotlin 插件之间的区别

JavaFX - 你如何在 Kotlin 中使用 MapValueFactory?

无法从 XML 访问 NavHostFragment

来自类型参数的属性的自定义 getter

runOnUiThread 没有调用

Android Kotlin StringRes 数量String

@uncheckedVariance 在 Kotlin 中?

更新到版本4.10.1/4.10.2后 Gradle 同步失败

Kotlin:什么是 kotlin.String!类型

Kotlin中具有多个参数的绑定适配器

Android Kotlin 创建类实现 Parcelable 在 writeToParcel 方法的 override中给出错误

Kotlin Android:属性委托必须有一个 'getValue(DashViewModel, KProperty*>)' 方法