对于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
类型一起使用。