Kotlin暴露的自定义类型/转换器

时间:2019-09-12 05:15:30

标签: kotlin kotlin-exposed

对于DAO中的“暴露的自定义类型”,我有一个局部解决方案,我正在寻求帮助以使该解决方案更加通用。

背景:我为BigDecimal创建了一个名为Decimal的包装,以解决两个问题:修复BigDecimal(1.0) != BigDecimal(1),并为Kotlin序列化提供更好的解决方案。我没有在此处提供完整的解决方案,但是如果人们感兴趣,可以提供。

我创建了以下代码以更好地处理暴露的DAO:

class Decimal(val bigDecimal: BigDecimal)

object Cities : IntIdTable() {
    val money = decimal("money", 10, 2)
}

class City(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<City>(Cities)

    var money by DecimalConverter(Cities.money)
}

class DecimalConverter(val delegate: Column<BigDecimal>) {
    operator fun getValue(thisRef: Entity<Int>, property: KProperty<*>): Decimal {
        return Decimal(thisRef.getValue(delegate, property))
    }

    operator fun setValue(thisRef: Entity<Int>, property: KProperty<*>, value: Decimal) {
        thisRef.setValue(delegate, property, value.bigDecimal)
    }

    fun Entity<Int>.getValue(c: Column<BigDecimal>, property: KProperty<*>) = c.getValue(this, property)
    fun Entity<Int>.setValue(c: Column<BigDecimal>, property: KProperty<*>, value: BigDecimal) = c.setValue(this, property, value)
}

我喜欢City DAO的结果,但是我的解决方案仅适用于Entity<Int>。我希望使其更通用,因此DecimalConverter可以与任何Entity类型一起使用。

0 个答案:

没有答案