当列名称及其值在运行时确定时,如何使用jooq更新表

时间:2018-08-02 11:37:41

标签: kotlin jooq

我有表列名称的列表,它的值将在运行时确定。现在,我正在使用以下方法来实现英尺,这需要为每个单个列名将Filed强制转换为TableField。有什么更好的方法吗?

override fun updateFields(job: Job, jsonObject: JsonObject, handler: Handler<AsyncResult<Job?>>): JobQService {


    val updateFieldsDsl = dslContext.update(JOB)

    var feildSetDsl: UpdateSetMoreStep<*>? = null

    jsonObject.map.keys.forEach { column ->
        feildSetDsl = if (feildSetDsl == null) {
            updateFieldsDsl.set(JOB.field(column) as TableField<Record, Any>, jsonObject.getValue(column))
        } else {
            feildSetDsl!!.set(JOB.field(column) as TableField<Record, Any>, jsonObject.getValue(column))
        }
    }

    val queryDsl = feildSetDsl!!.where(JOB.ID.eq(job.id))

    jdbcClient.rxUpdateWithParams(queryDsl.sql, JsonArray(queryDsl.bindValues)).subscribeBy(
            onSuccess = { handler.handle(Future.succeededFuture(job)) },
            onError = { handler.handle(Future.failedFuture(it)) }

    )

    return this;
}

1 个答案:

答案 0 :(得分:1)

我不确定“更好”是什么意思,但是有一种方法UpdateSetStep.set(Map),它似乎对您要尝试执行的操作很有帮助。参见javadoc:

  

UpdateSetMoreStep set(Map <?,?> map)

     

为UPDATE语句中的字段设置一个值。   键可以是字符串,名称或字段类型。

     

值可以是或Field 类型。 jOOQ将尝试将值转换为其相应字段的类型。