我有一個 POJO,其中包含可以更新的欄位。但有時只需要更新幾個欄位,其余欄位為空。如何撰寫忽略空欄位的更新陳述句?回圈遍歷未丟失的陳述句并動態添加到 set 陳述句或使用合并陳述句會更好嗎?
我有以下查詢:
jooqService.using(txn)
.update(USER_DETAILS)
.set(USER_DETAILS.NAME, input.name)
.set(USER_DETAILS.LAST_NAME, input.lastName)
.set(USER_DETAILS.COURSES, input.courses)
.set(USER_DETAILS.SCHOOL, input.school)
.where(USER_DETAILS.ID.eq(input.id))
.execute()
如果有更好的做法?
uj5u.com熱心網友回復:
我不知道 Jooq,但看起來你可以簡單地這樣做:
val jooq = jooqService.using(txn).update(USER_DETAILS)
input.name.let {jooq.set(USER_DETAILS.NAME, it)}
input.lastName.let {jooq.set(USER_DETAILS.LAST_NAME, it)}
等等...
編輯:在我看來,如上明確映射這些欄位是最清楚的,但您可以執行以下操作:
val fields = new Object[] {USER_DETAILS.NAME, USER_DETAILS.LAST_NAME}
val values = new Object[] {input.name, input.lastName}
val jooq = jooqService.using(txn).update(USER_DETAILS)
values.forEachIndexed { i, value ->
value.let {jooq.set(fields[i], value)}
}
您仍然需要在陣列中明確且一致地列舉所有欄位和值才能使其作業。這對我來說似乎不太可讀,而且更容易出錯。
uj5u.com熱心網友回復:
在 Java 中,它會是這樣的
var jooqQuery = jooqService.using(txn)
.update(USER_DETAILS);
if (input.name != null) {
jooqQuery.set(USER_DETAILS.NAME, input.name);
}
if (input.lastName != null) {
jooqQuery.set(USER_DETAILS.LAST_NAME, input.lastName);
}
// ...
jooqQuery.where(USER_DETAILS.ID.eq(input.id))
.execute();
uj5u.com熱心網友回復:
另一種選擇而不是撰寫此UPDATE陳述句是使用UpdatableRecord:
// Load a POJO into a record using a RecordUnmapper
UserDetailsRecord r =
jooqService.using(txn)
.newRecord(USER_DETAILS, input)
(0 .. r.size() - 1).forEach { if (r[it] == null) r.changed(it, false) }
r.update();
您可能可以撰寫一個擴展函式,使其可用于全域所有 jOOQ 記錄,例如 as r.updateNonNulls()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/346942.html
標籤:PostgreSQL 科特林 乔克
上一篇:Postgres-將dateString轉換為int8
下一篇:更新具有先前值的列
