Мой вопрос похож на serviceHub.vaultQueryService.queryBy возвращает все связанные состояния по умолчанию? за исключением того, что мы сопоставили схемы для состояний и используем TypedQueries для извлечения состояний из базы данных.
Поток который запрашивает состояние из базы данных:
@StartableByRPC
@Transactional
open class FetchServiceById(
private val serviceId: UniqueIdentifier
) : FlowLogic<List<ServiceSchemaV1.PersistentService>>() {
@Suspendable
override fun call(): List<ServiceSchemaV1.PersistentService> {
return serviceHub.withEntityManager {
createQuery(
"SELECT s FROM $TABLE_NAME s WHERE s.linearId = ?1",
ServiceSchemaV1.PersistentService::class.java
).setParameter(
1,
serviceId.id
).resultList
}
}
private companion object {
val TABLE_NAME = ServiceSchemaV1.PersistentService::class.jvmName
}
}
Это возвращает состояние правильно, но после обновления определенного состояния и повторного выполнения запроса возвращает как старое, использованное состояние, так и новое неизрасходованное состояние.
Я проверил базу данных h2 и вижу, что после обновления состояния в VAULT_STATE есть дата в CONSUMED_TIMESTAMP, и ее STATE_STATUS равно 1.
Как мы можем запрашивать только неиспользованные состояния с помощью типизированных запросов? Я знаю, что мы могли бы просто использовать линейные запросы, но когда нам нужно запрашивать и объединять данные из разных состояний, я не думаю, что это было бы осуществимо в вычислительном отношении.
Схема, которую использует состояние
object ServiceSchema
object ServiceSchemaV1 : MappedSchema(
schemaFamily = ServiceSchema.javaClass,
version = 1,
mappedTypes = listOf(
PersistentService::class.java
)) {
@Entity
@Table(name = "service_states")
class PersistentService(
@Column(name = "accountoperator")
var accountOperator: String,
@Column(name = "serviceprovider")
var serviceProvider: String,
@Column(name = "servicename")
var serviceName: String,
@Column(name = "servicedescription")
var serviceDescription: String,
@Column(name = "datacreated")
var dataCreated: LocalDate,
@Column(name = "linear_id")
var linearId: UUID,
@ElementCollection
@Column(name = "service_data_ids")
var serviceDataIds: MutableList<UUID>,
@ElementCollection
@Column(name = "service_partners")
var servicePartners: MutableList<String>
) : PersistentState() {
constructor() : this(
"",
"",
"",
"",
LocalDate.now(),
UUID.randomUUID(),
mutableListOf(),
mutableListOf()
)
}
}