以下是我使用 Micronaut 框架编写的 Kotlin 代码的一部分:
import io.micronaut.data.annotation.MappedEntity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.Table
@MappedEntity
@Table(name = "special", schema = "abc")
data class SpecialEntity(
val uuid: Uuid,
@GeneratedValue
val createdAt: Instant? = null
)
import io.micronaut.data.jdbc.annotation.JdbcRepository
import io.micronaut.data.repository.kotlin.CoroutineCrudRepository
import java.util.UUID
@JdbcRepository
interface SpecialEntityRepository : CoroutineCrudRepository<SpecialEntity, UUID> {
suspend fun saveAll(entities: Iterable<SpecialEntity>): ArrayList<SpecialEntity>
}
我面临的问题是,由于
GeneratedValue
注释,Micronaut 从用于将实体插入数据库的查询中省略了该字段。这就是我最初想要的。但现在有一个用例有时需要手动设置该值。
我已经检查了其他注释,例如
@DateCreated
,它不起作用,因为它总是设置当前时间戳。 @Query
注释也不起作用,因为查询需要是静态的,但我需要进行批量插入。
基本上我想要的是当字段非空时将该字段包含在插入查询中。当它为空时,应该从查询中省略它。最好的方法是什么?
@ColumnTransformer(write = "COALESCE(?, now())")
成功了!