Котлин выставил отображение 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) }
}
Картирование должно быть сделано автоматически. Смотрите документацию:
Таблица:
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]
}
}
}
}
}
}