微型计算机JDBC:使用Kotlin值类作为@Id

eqqqjvef  于 2023-03-03  发布在  Kotlin
关注(0)|答案(1)|浏览(111)

是否可以使用Kotlin值类作为@Id属性?

    • 实体:**
import io.micronaut.data.annotation.*

@JvmInline
value class UserId(val value: Int)

@MappedEntity("users")
data class User(
    @field:Id
    @field:GeneratedValue
    val id: Int = UserId(0),
    val name: String
)
    • 回购:**
import io.micronaut.data.jdbc.annotation.JdbcRepository
import io.micronaut.data.model.query.builder.sql.Dialect
import io.micronaut.data.repository.CrudRepository

// Repo
@JdbcRepository(dialect = Dialect.POSTGRES)
interface UsersRepo : CrudRepository<User, UserId>

目前,在编译过程中,我得到了以下错误:

error: Unable to implement Repository method: UsersRepo.update(Object entity). No identity is present

当然,使用 * micronaut-data-jpa * 是不可能的,但是 * micronaut-data-jdbc * 呢?

o4hqfura

o4hqfura1#

据我所知没有,但是,你可以使用类型别名来实现一些"类似的"(可读性方面):
类型别名为现有类型提供替代名称。如果类型名称太长,可以引入其他较短的名称,然后使用新名称。

typealias UserId = String

因此,上述内容将变为:

import io.micronaut.data.annotation.*

typealias UserId = Int

@MappedEntity("users")
data class User(
    @field:Id
    @field:GeneratedValue
    val id: UserId = 0,
    val name: String
)

但是,请注意,* 类型别名不会引入新类型 *。它们等效于相应的基础类型。
例如,当你添加typealias Predicate<T>并在代码中使用Predicate<Int>时,Kotlin编译器总是将其扩展为(Int) -> Boolean。因此,每当需要通用函数类型时,你可以传递你的类型的变量,反之亦然:

typealias Predicate<T> = (T) -> Boolean

fun applyTo42(predicate: Predicate<Int>): Boolean = predicate(42)

fun main() {
    val function: (Int) -> Boolean = { it > 0 }
    val predicate: Predicate<Int>  = { it > 0 }

    println(applyTo42(function))  // => "true"
    println(applyTo42(predicate)) // => "true"
}

参考:Kotlin - Type aliases

相关问题