Kotlin 使用JetBrains避免insert和update语句中的代码重复

Kotlin 使用JetBrains避免insert和update语句中的代码重复,kotlin,kotlin-exposed,Kotlin,Kotlin Exposed,我在一个新项目中使用Exposed,我注意到对于insert和update语句,我必须复制记录值的所有赋值 例如: val orderId = Orders.insert { it[orderType] = orderDTO.orderType it[deliveryDateTime] = LocalDateTime.of( LocalDate.parse(orderDTO.deliveryDate), LocalTime.parse(orderD

我在一个新项目中使用Exposed,我注意到对于insert和update语句,我必须复制记录值的所有赋值

例如:

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)->Unit
,而在更新中,主体类型为
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) }
fun Orders.insertOrUpdate(it:UpdateBuilder,orderDTO:orderDTO){
it[orderType]=orderDTO.orderType
it[deliveryDateTime]=LocalDateTime.of(
parse(orderDTO.deliveryDate),
parse(orderDTO.deliveryTime)
)
it[客户名称]=订单到客户名称
it[customerPhone]=orderDTO.customerPhone
it[customerAddress]=orderDTO.customerAddress
}
val orderId=Orders.insert{insertOrUpdate(it,orderDTO)}get Orders.id
Orders.update{insertOrUpdate(it,orderDTO)}

是的,这可能是一个解决方案。我编辑了你的答案,添加了一些缺失的部分。非常感谢。