Kotlin раскрыл ВЫБОР одной записи

#kotlin #ktor #kotlin-exposed

#kotlin #ktor #kotlin-подвергается

Вопрос:

есть ли какой-либо способ выбрать только одну запись с kotlin exposed? В настоящее время я использую приведенный ниже код для выбора пользователя из базы данных, но есть ли какая-либо функция, подобная selectSingle(), для получения объекта (не списка)?

 fun getUser(userId: Int): User? {

    var user: User? = null

    transaction {
        user = UserTable.select { UserTable.id eq userId }.limit(1).map { User.fromRow(it) }[0]
    }

    return user
}
 

Ответ №1:

Я нашел хорошее решение для этого. Кредиты получает hfazai

 fun getUser(userId: Int): User? {

var user: User? = null

val user = transaction {
   user = UserTable.select { UserTable.id eq userId }.limit(1).single().let { User.fromRow(it) }
}

return user
}
 

PS: single() вызовет исключение NoSuchElementException, если результата нет, и исключение IllegalArgumentException, если имеется более одной результирующей строки.

также вы можете исключить пользовательскую переменную

 fun getUser(userId: Int): User = 
        transaction {
                UserTable.select { UserTable.id eq userId }.limit(1).single().let { User.fromRow(it) }
        }
 

Ответ №2:

Другого способа, кроме того, что вы уже делаете, нет. Вы можете использовать first() или firstOrNull вместо [0] .

Как всегда с Kotlin, вы можете создать свой собственный добавочный номер для упрощения вызовов:

 fun Query.selectSingle() = limit(1).firstOrNull()
 

В особом случае, когда вы извлекаете объекты по их первичному ключу, вы можете использовать DAO findById (docs).
Использование DAOs дает вам дополнительное преимущество реализации wrapRow / wrapRows (пример использования), которая, я бы предположил, работает аналогично User.fromRow(it) вашему коду.