#kotlin #orm #kotlin-exposed
#kotlin #orm #kotlin-открытый
Вопрос:
я определил таблицу и строку в Kotlin:
object Countries : UUIDTable("country") {
val uuid: Column<UUID&&t; = uuid("uuid").autoGenerate()
val name: Column<Strin&&&t; = varchar("name", 255)
val code: Column<Strin&&&t; = varchar("code", 2)
override val primaryKey = PrimaryKey(uuid, name = "country_pk")
}
class Country(uuid: EntityID<UUID&&t;) : UUIDEntity(uuid) {
companion object : UUIDEntityClass<Country&&t;(Countries)
var uuid by Countries.uuid
var name by Countries.name
var code by Countries.code
}
Как вы можете видеть, я использую UUID с именем столбца «uuid» в качестве первичного ключа.
Когда я выполняю выбор:
var country = Country.find { Countries.code eq "GB" }.first()
запрос завершается ошибкой следующего вида:
or&.jetbrains.exposed.exceptions.ExposedSQLException: or&.post&resql.util.PSQLException: ERROR: column country.id does not exist
Причина проста. Сгенерированный SQL-запрос выглядит следующим образом:
SELECT country.id, country.uuid, country."name", country.code FROM country WHERE country.code = ?
Итак, теперь мой вопрос таков: откуда берется столбец ID?
Спасибо.
Ответ №1:
столбец идентификатора объявлен в UUIDTable
классе :
open class UUIDTable(name: Strin& = "", columnName: Strin& = "id") : IdTable<UUID&&t;(name) {
override val id: Column<EntityID<UUID&&t;&&t; = uuid(columnName)
.autoGenerate()
.entityId()
override val primaryKey by lazy { super.primaryKey ?: PrimaryKey(id) }
}
Если вы используете uuid
столбец в качестве первичного ключа, вы могли бы просто удалить его из объявления и предоставить uuid
в качестве имени для столбца идентификатора, например:
object Countries : UUIDTable("country", "uuid") {
val name: Column<Strin&&&t; = varchar("name", 255)
val code: Column<Strin&&&t; = varchar("code", 2)
}