Котлин выставил отображение DSL Query

  • Как сопоставить, выберите Запрос к классу
  • Есть ли аннотация @transactional для выполнения запроса?

    object UserRepository {
    fun getAll() : List<User> {
       return User.selectAll().map { User } // how to add it in a transaction ? // Is it the right way to map query to a Class ?
    }
    
    fun get(id: Int) : User? {
        return User.select { User.id eq id id}.map { User.it } // Mapping Not working
    }
    

3 ответа

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

data class User(
    val id: Int,
    val username: String,
    val password: String
) {

    companion object {

        fun fromRow(resultRow: ResultRow) = User(
            id = resultRow[UserTable.id].value,
            username= resultRow[UserTable.username],
            password = resultRow[UserTable.password]
        )
    }
}

и в вашем блоке транзакции:

transaction {
        user = UserTable.select { UserTable.id eq userId }.map { User.fromRow(it) }
    }

Картирование должно быть сделано автоматически. Смотрите документацию:

Документация по DAO

Документация по DSL

Документация по транзакциям

Таблица:

object Users : IntIdTable() {
  val name = varchar("name", 50)
}

Сущность:

class User(id: EntityID<Int>) : IntEntity(id) {
  companion object : IntEntityClass<User>(Users)

  var name     by Users.name
}

Использование:

fun getAllUsers(): List<User> {
  Database.connect(/* ... */)
  return transaction {
    User.all().toList()
  }
}

Мое решение для извлечения значений в HashMap с pk в качестве значения

          fun getRaw(): List<HashMap<String, Any?>> {
        return transaction {
            val list = Users.selectAll().toList()

            list.map { data ->
                HashMap<String, Any?>().also { map ->
                    Users.columns.forEach {
                        if (data[it] is EntityID<*>) {
                            map[it.name] = (data[it] as EntityID<*>).value
                        } else {
                            map[it.name] = data[it]
                        }
                    }
                }
            }
        }
    }
Другие вопросы по тегам