VaultCustomQueryCriteria для состояния в Corda

#corda

#corda

Вопрос:

Я пытаюсь запросить состояние из хранилища, не используя линейный идентификатор состояния, а вместо него переменную Int (уникальную), присутствующую в схеме

 val sNumber = AState.ASchemaV1.AEntity::SNumber
val QueryCriteria = QueryCriteria.VaultCustomQueryCriteria(sNumber.equal(SalesNumber))
val StateAndRef = serviceHub.vaultService.queryBy<AState>(QueryCriteria).states.single()
val outState = StateAndRef.state.data
  

Критерии запроса не выдают никаких ошибок, но я также не получаю никаких выходных данных, но при отладке я получил ответ об ошибке

 javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity: AState.ASchemaV1.AEntity
  

но я определил все столбцы в функции. Чего мне не хватает?
Вот код для схемы

     override fun supportedSchemas() = listOf(ASchemaV1)
    override fun generateMappedObject(schema: MappedSchema) = ASchemaV1.AEntity(this)

    object ASchemaV1 : MappedSchema(AState::class.java, 1, listOf(AEntity::class.java)) {
        @Entity
        @Table(name = "Table")
        class AEntity(A: AState) : PersistentState() {
            @Column
            var CONumber: String = A.linearId.id.toString()
            @Column
            var SalesNumber: Int = A.SalesNumber
            @Column
            var ProductID: Int = A.ProductID
            @Column
            var Quantity: Int = A.Quantity
            @Column
            var Rate: Double = A.Rate
            @Column
            var DeliveryDate: Date = A.DeliveryDate
            @Column
            var DeliveryLocation: String = A.DeliveryLocation
            @Column
            var Status: String = A.Status.toString()
        }
    }
  

Комментарии:

1. Можете ли вы показать код для состояния. ASchemaV1?

2. Код схемы не находится в отдельном файле, а создается как объект в классе данных состояния

Ответ №1:

Состояние.В ASchemaV1 отсутствует конструктор.

 object ASchemaV1 : MappedSchema(AState::class.java, 1, listOf(AEntity::class.java)) {
    @Entity
    @Table(name = "Table")
    class AEntity(
        @Column
        var CONumber: String,
        @Column
        var SalesNumber: Int,
        @Column
        var ProductID: Int,
        @Column
        var Quantity: Int,
        @Column
        var Rate: Double,
        @Column
        var DeliveryDate: Date,
        @Column
        var DeliveryLocation: String,
        @Column
        var Status: String
    ): PersistentState() {
       constructor(A: AState): this(A.linearId.id.toString(), A.SalesNumber, A.ProductID, A.Quantity, A.Rate, A.DeliveryDate, A.DeliveryLocation, A.Status.toString())
    }
}
  

Комментарии:

1. Разве у него уже нет конструктора с состоянием. Зачем мне нужно явно определять столбцы в основном конструкторе?

2. Это не сработало, и kotlin jpa генерирует конструктор по умолчанию