Измените имя идентификатора в открытом ORM

#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)
}