【问题标题】:Corda - VaultQuery with aggregate SUM (field Double in MappedSchema)Corda - 具有聚合 SUM 的 VaultQuery(MappedSchema 中的 Double 字段)
【发布时间】:2020-07-11 00:53:35
【问题描述】:

我需要总结一个州的列。我创建了一个 mappedSchema 并将该字段定义为 Double。 如果我列出状态,则该字段的值是正确的。但是,如果我使用 builder::sum(),则返回的值会出现舍入问题和更多的小数位。

以下是代码摘录:

状态

data class ConsumerMeteringState(val metering : ConsumerMetering,
                             val meteringParticipants : List<AbstractParty> = listOf(),
                             override val linearId: UniqueIdentifier = UniqueIdentifier()) :
    LinearState, QueryableState {
override val participants: List<AbstractParty> = meteringParticipants

override fun generateMappedObject(schema: MappedSchema): PersistentState {
    return when (schema) {
        is ConsumerMeteringSchemaV1 -> ConsumerMeteringSchemaV1.PersistentConsumerMetering(
                this.metering.dateTimeIni,
                this.metering.dateTimeEnd,
                this.metering.quantityKwh,
                this.linearId.id
        )
        else -> throw IllegalArgumentException("Unrecognised schema $schema")
    }
}

override fun supportedSchemas(): Iterable<MappedSchema> = listOf(ConsumerMeteringSchemaV1)

架构

object ConsumerMeteringSchemaV1 : MappedSchema(
    schemaFamily = ConsumerMeteringSchema.javaClass,
    version = 1,
    mappedTypes = listOf(PersistentConsumerMetering::class.java)) {
@Entity
@Table(name = "consumer_metering_states")
class PersistentConsumerMetering(
        @Column(name = "date_time_ini")
        var dateTimeIni: Instant,

        @Column(name = "date_time_end")
        var dateTimeEnd: Instant,

        @Column(name = "quantity_kwh")
        var quantityKwh: Double,

        @Column(name = "linear_id")
        var linearId: UUID
) : PersistentState() {
    // Default constructor required by hibernate.
    constructor(): this(Instant.now(), Instant.now(), 0.0, UUID.randomUUID())
}

}

保险柜查询标准

val criteriaAccount = QueryCriteria.VaultQueryCriteria(externalIds = listOf(accountId))
val sumQuantityKwh = builder { ConsumerMeteringSchemaV1
            .PersistentConsumerMetering::quantityKwh.sum() }
val sumQuantityKwhCriteria = QueryCriteria.VaultCustomQueryCriteria(sumQuantityKwh)
serviceHub.vaultService.queryBy(contractStateType = ConsumerMeteringState::class.java,
    criteria = criteriaAccount.and(sumQuantityKwhCriteria)).otherResults.singleOrNull()

仅状态(值正常):

[ConsumerMeteringState(metering=ConsumerMetering(dateTimeIni=2020-06-03T09:46:00Z, dateTimeEnd=2020-06-03T09:59:00Z, quantityKwh=10.55), meteringParticipants=[匿名(DL624i3ieTdLkPRBUvUgZnzn5jeG3Md2cvANt6sZNJiXwy),O=分销商,L=Curitiba,C=BR],linearId=2e5009ad-56c3-4fed-ba36-deb0d48e668c),ConsumerMeteringState(metering=ConsumerMetering(dateTimeIni=2020-00Z-03) 2020-06-03T09:59:00Z,quantityKwh=50.18),meteringParticipants=[匿名(DLBep6kdDduaMKVrszQWa7N8i6YNnJLtA4WXsp4QmZiEjC),O=分销商,L=Curitiba,C=BR],linear76d=3b012984-6e -9b9f-1bb8158aaf4b)]

与建设者总和:

我得到值 60.730000000000004

为什么 sum 不返回 60.73 ?

【问题讨论】:

    标签: corda


    【解决方案1】:

    它通过将列类型从 Double 更改为 BigDecimal 来工作。这似乎是 Double 类型的精度问题。 我只是通过检索状态并对 quantityKwh (Double) 字段进行简单求和来进行测试,精度已经很奇怪了。 我不明白这种行为的原因,但使用 BigDecimal 可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多