#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)
вашему коду.