当前,我们的项目中有很多这种模式。加载实体并随后保存它是一个非常普通的任务。在Kotlin中,是否有一种更简洁,更少冗余的方式?
userRepository.findOne(1L)?.let {
userRepository.save(it.apply {
firstName = "Jon"
lastName = "Doe"
})
} ?: throw NoSuchElementException("User not found")
如果您想知道findOne
返回null
的位置或实体而不是Optional
的来源,请查看here。
答案 0 :(得分:0)
我不知道有什么官方方法可以使它更简洁,但是您可以像这样在JpaRepository
上创建扩展功能:
inline fun <reified T : Any, ID: Serializable> JpaRepository<T, ID>.update(id: ID, modify: T.() -> Unit) = findOne(id)?.let {
modify(it)
saveAndFlush(it)
} ?: throw NoSuchElementException("There is no ${T::class.simpleName} with id $id!")
并像这样使用它:
userRepository.update(1L) {
firstName = "Jon"
lastName = "Doe"
}
这将使呼叫站点真正干净简洁。
update
当然可以返回null
而不是抛出异常。这取决于您的用例。
如果您想知道为什么我马上问并回答了这个问题,请看一下here。