1

When using JOOQ to create the queries and Jasync to execute the queries, how does one get the RowData back into JOOQ Records?

This is my notransaction helper which does a suspendable non-async query

    override suspend fun <T> notransaction(f: suspend (ConnectionPool<*>) -> T): T {
        val cdf = CompletableDeferred<T>()
        try {
            GlobalScope.launch {
                cdf.complete(f(connectionPool))
            }
        } catch (e: Throwable) {
            log.error(e.message ?: "", e)
            cdf.completeExceptionally(e)
        }
        return cdf.await()
    }

I have defined two tables with their relevant records:


class ListingRecord : CustomRecord<ListingRecord>(listing)
class ListingTable : CustomTable<ListingRecord>(DSL.name("listing")) {

    val id: TableField<ListingRecord, UUID> = createField(DSL.name("id"), SQLDataType.UUID)
    val title: TableField<ListingRecord, String> = createField(DSL.name("title"), SQLDataType.VARCHAR)

    companion object {
        val listing = ListingTable()
    }

    override fun getRecordType(): Class<out ListingRecord> {
        return ListingRecord::class.java
    }

}

class ListingImageRecord : CustomRecord<ListingImageRecord>(listingImage)
class ListingImageTable : CustomTable<ListingImageRecord>(DSL.name("listing_image")) {

    val id: TableField<ListingImageRecord, UUID> = createField(DSL.name("id"), SQLDataType.UUID)
    val name: TableField<ListingImageRecord, String> = createField(DSL.name("name"), SQLDataType.VARCHAR)
    val listingId: TableField<ListingImageRecord, UUID> = createField(DSL.name("listing"), SQLDataType.UUID)

    companion object {
        val listingImage = ListingImageTable()
    }

    override fun getRecordType(): Class<out ListingImageRecord> {
        return ListingImageRecord::class.java
    }

}

Generated an SQL query

    val dsl = DSL.using(SQLDialect.POSTGRES)
    val query = dsl.select(
        listing.id, listing.title,
        listingImage.id, listingImage.listingId
    ).from(listing).leftJoin(listingImage).on(listing.id.eq(listingImage.listingId))

enter image description here

how does one map the RowData back to JOOQ? Is there some way to get a map of columns in the select statement and their indices or some other way to map results back? I'm assuming i need to map it back to a Record somehow so that i can do

listing.id.get(ListingRecord)
Jan Vladimir Mostert
  • 12,380
  • 15
  • 80
  • 137
  • From Lukas: It should be possible to implement this without too much hassle: Flux magic(ResultQuery query); The implementation then works for all jOOQ queries, and is reasonably type safe. – Jan Vladimir Mostert Oct 20 '20 at 20:25

0 Answers0