Избегайте дублирования кода в операторах вставки и обновления с помощью 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
}

Я пытаюсь извлечь общие назначения в лямбда-выражении или функции, но в первом случае тело имеет тип T.(InsertStatement<Number>)->Unit, а в обновлении - T.(UpdateStatement)->Unit, поэтому я не вижу простого способа добиться этого.

Я что-то упускаю или это сделано намеренно?


person davioooh    schedule 25.06.2020    source источник


Ответы (1)


Возможно, вы могли бы сделать что-то вроде этого: функцию с общими входными параметрами, которые вы можете вызывать из лямбда-выражений:

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) }
person Tenfour04    schedule 25.06.2020
comment
Да, это могло быть решением. Я отредактировал ваш ответ, добавив недостающие части. Спасибо. - person davioooh; 26.06.2020