【发布时间】:2018-09-05 18:36:18
【问题描述】:
在 Corda V3 中,我们正在扩展 FungibleState,如 API Vault Query 文档中所述:
object CustomSchemaV1 : MappedSchema(schemaFamily = CustomSchema.javaClass, version = 1, mappedTypes = listOf(PersistentCustomState::class.java))
{
@Entity
@Table(name = "custom_states", indexes = arrayOf(Index(name = "custom_field_idx", columnList = "custom_field")))
class PersistentCustomState(
/** Custom attributes */
@Column(name = "custom_field")
var customField: String? = null,
/** FungibleState parent attributes */
@Transient
val _participants: Set<AbstractParty>,
@Transient
val _owner: AbstractParty,
@Transient
val _quantity: Long,
@Transient
val _issuerParty: AbstractParty,
@Transient
val _issuerRef: OpaqueBytes
) : CommonSchemaV1.FungibleState(_participants?.toMutableSet(), _owner, _quantity, _issuerParty, _issuerRef.bytes)}
使用这种模式,我们如何对 _quantity 父字段进行求和,按 custom_field 分组?
查看示例,我们尝试使用QueryCriteria:
val sum = builder {
CustomSchemaV1.PersistentCustomState::_quantity.sum(
groupByColumns = listOf(
CustomSchemaV1.PersistentCustomState::customField
),
orderBy = Sort.Direction.ASC
)
}
return QueryCriteria.VaultCustomQueryCriteria(sum)
但这会引发错误:Unable to locate Attribute with the the given name [_quantity] on this ManagedType [net.corda.core.schemas.PersistentState]
我们能够解决删除 @Transient 注释的方法,该注释也将 quantity 保留在子类上,但这会导致在数据库中存储重复值。
【问题讨论】: