Kotlin предоставил сопоставление запросов DSL

  • Как сопоставить выбранный запрос с классом
  • Есть ли аннотация @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
    }
    

person brabo-hi    schedule 14.05.2018    source источник
comment
Я советую вам начать с чтения этого сообщения в блоге spring.io/blog/2016/03/20/   -  person Tapac    schedule 15.05.2018


Ответы (2)


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

Документация по 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()
  }
}
person zoku    schedule 28.05.2018
comment
У меня это не работает. Он говорит, что определение типа не удалось. Ожидаемое несоответствие типа: требуется: Список ‹User› найдено: Список ‹ResultRow› - person Oxymoron; 02.07.2019
comment
Ничего. Я делал Users.all(), а не User.all() - person Oxymoron; 02.07.2019

Я знаю, что уже поздно, но для других людей, у которых есть этот вопрос: если вы используете 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) }
    }
person Ali Zarei    schedule 30.11.2020