使用 JetBrains Exposed 避免插入和更新语句中的代码重复
Avoid code duplication in insert and update statements using JetBrains Exposed
我在新项目中使用 Exposed,我注意到对于插入和更新语句,我必须复制记录值的所有赋值。
一个例子:
val orderId = Orders.insert {
it[orderType] = orderDTO.orderType
it[deliveryDateTime] = LocalDateTime.of(
LocalDate.parse(orderDTO.deliveryDate),
LocalTime.parse(orderDTO.deliveryTime)
)
it[customerName] = orderDTO.customerName
it[customerPhone] = orderDTO.customerPhone
it[customerAddress] = orderDTO.customerAddress
// ... other fields
} get Orders.id
Orders.update({ Orders.id eq orderId }) {
it[orderType] = orderDTO.orderType
it[deliveryDateTime] = LocalDateTime.of(
LocalDate.parse(orderDTO.deliveryDate),
LocalTime.parse(orderDTO.deliveryTime)
)
it[customerName] = orderDTO.customerName
it[customerPhone] = orderDTO.customerPhone
it[customerAddress] = orderDTO.customerAddress
// ... other fields
}
我正在尝试提取 lambda 或函数中的常见赋值,但在第一种情况下,正文是 T.(InsertStatement<Number>)->Unit
类型,而在更新中它是 T.(UpdateStatement)->Unit
,所以我没有找到实现此目标的简单方法。
我是不是遗漏了什么或者这是设计使然?
也许您可以这样做:一个具有您可以从 lambda 调用的通用输入参数的函数:
fun Orders.insertOrUpdate(it: UpdateBuilder<Number>, orderDTO: OrderDTO) {
it[orderType] = orderDTO.orderType
it[deliveryDateTime] = LocalDateTime.of(
LocalDate.parse(orderDTO.deliveryDate),
LocalTime.parse(orderDTO.deliveryTime)
)
it[customerName] = orderDTO.customerName
it[customerPhone] = orderDTO.customerPhone
it[customerAddress] = orderDTO.customerAddress
}
val orderId = Orders.insert { insertOrUpdate(it, orderDTO) } get Orders.id
Orders.update { insertOrUpdate(it, orderDTO) }
我在新项目中使用 Exposed,我注意到对于插入和更新语句,我必须复制记录值的所有赋值。
一个例子:
val orderId = Orders.insert {
it[orderType] = orderDTO.orderType
it[deliveryDateTime] = LocalDateTime.of(
LocalDate.parse(orderDTO.deliveryDate),
LocalTime.parse(orderDTO.deliveryTime)
)
it[customerName] = orderDTO.customerName
it[customerPhone] = orderDTO.customerPhone
it[customerAddress] = orderDTO.customerAddress
// ... other fields
} get Orders.id
Orders.update({ Orders.id eq orderId }) {
it[orderType] = orderDTO.orderType
it[deliveryDateTime] = LocalDateTime.of(
LocalDate.parse(orderDTO.deliveryDate),
LocalTime.parse(orderDTO.deliveryTime)
)
it[customerName] = orderDTO.customerName
it[customerPhone] = orderDTO.customerPhone
it[customerAddress] = orderDTO.customerAddress
// ... other fields
}
我正在尝试提取 lambda 或函数中的常见赋值,但在第一种情况下,正文是 T.(InsertStatement<Number>)->Unit
类型,而在更新中它是 T.(UpdateStatement)->Unit
,所以我没有找到实现此目标的简单方法。
我是不是遗漏了什么或者这是设计使然?
也许您可以这样做:一个具有您可以从 lambda 调用的通用输入参数的函数:
fun Orders.insertOrUpdate(it: UpdateBuilder<Number>, orderDTO: OrderDTO) {
it[orderType] = orderDTO.orderType
it[deliveryDateTime] = LocalDateTime.of(
LocalDate.parse(orderDTO.deliveryDate),
LocalTime.parse(orderDTO.deliveryTime)
)
it[customerName] = orderDTO.customerName
it[customerPhone] = orderDTO.customerPhone
it[customerAddress] = orderDTO.customerAddress
}
val orderId = Orders.insert { insertOrUpdate(it, orderDTO) } get Orders.id
Orders.update { insertOrUpdate(it, orderDTO) }