我有表列名称的列表,它的值将在运行时确定。现在,我正在使用以下方法来实现英尺,这需要为每个单个列名将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;
}
答案 0 :(得分:1)
我不确定“更好”是什么意思,但是有一种方法UpdateSetStep.set(Map)
,它似乎对您要尝试执行的操作很有帮助。参见javadoc:
UpdateSetMoreStep set(Map <?,?> map)
为UPDATE语句中的字段设置一个值。 键可以是字符串,名称或字段类型。
值可以是
或Field 类型。 jOOQ将尝试将值转换为其相应字段的类型。