kotlin - 使用 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 或函数中的常见分配,但在第一种情况下,主体是 type T.(InsertStatement<Number>)->Unit
,而在更新中它是 a T.(UpdateStatement)->Unit
,所以我看不到实现这一目标的简单方法。
我错过了什么还是设计使然?
解决方案
也许你可以做这样的事情:一个具有公共输入参数的函数,你可以从 lambdas 调用:
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) }
推荐阅读
- javascript - 如何使用 React js 更改元掩码中的网络
- python - 在python中自动化长列表
- reactjs - 巨大的 React 表单,需要从表单级别触发验证,委托给所有子级
- networking - 在 GCP 中连接共享 VPC
- react-native - React-Native, webView
- javascript - 使用 overflow:hidden 和 GreenSock 掩盖 div 中文本的可见性
- google-cloud-platform - 在 Google Cloud 中,为什么 Compute Engine 实例需要服务控制和服务管理 API
- bootstrap-4 - 我如何在这个引导导航栏中将“Home”、“Link”、“Dropdown”和“Disabled”居中?
- perl - Perl 一行最后添加文本但大文件的一行
- java - 具有 500k+ 元素列表的优化方法