java.lang.IllegalArgumentException:不是实体:class com.example.schema.AssetSchemaV1$PersistentAsset

java.lang.IllegalArgumentException: Not an entity: class com.example.schema.AssetSchemaV1$PersistentAsset

PersistentAsset 样本定义:

/**
 * The family of schemas for [Asset].
 */
object AssetSchema

/**
 * An [Asset] schema.
 */
object AssetSchemaV1 : MappedSchema(
        schemaFamily = AssetSchema.javaClass,
        version = 1,
        mappedTypes = listOf(PersistentAsset::class.java)) {
    @Entity
    @Table(name = "asset_states", indexes = arrayOf(Index(name = "asset_linear_id_idx", columnList = "linear_id"),
            Index(name = "asset_owner_idx", columnList = "asset_owner")))
    class PersistentAsset(
            @Column(name = "cusip")
            var cusip: String,

            @Column(name = "asset_owner")
            var owner: String,

            @Column(name = "trade_id")
            var tradeId: String,

            @Column(name = "collateral_status")
            var status: String

    ) : PersistentState() {
        constructor() : this("", "", "", "")
    }
}

但是当我在下面的 FlowLogic 中查询 运行 时:

val session = DatabaseTransactionManager.current().session
val criteriaBuilder = session.criteriaBuilder
val criteriaQuery = criteriaBuilder.createQuery(Array<Any>::class.java)
val fromAsset = criteriaQuery.from(PersistentAsset::class.java)
criteriaQuery.select(criteriaBuilder.array(fromAsset.get<String>(PersistentAsset::cusip.name)))
val cusips = session.createQuery(criteriaQuery).resultList

它抛出:java.lang.IllegalArgumentException:不是实体:class com.example.schema.AssetSchemaV1$PersistentAsset

不知道为什么我在 PersistentAsset 架构 class 用 @Entity

注释后收到此错误

流程不公开 Hibernate 会话,因此没有对 JPQL 的内置支持。您可以使用 ServiceHub.jdbcSession 在流中查询节点的数据库。

这是一个例子:

val results = serviceHub.jdbcSession().prepareStatement(
    "select * from ASSET_STATES"
).executeQuery()

while (results.next()) {
    val cussip = results.getString("cussip")
    val assetOwner = results.getString("asset_owner")
    val tradeId = results.getString("trade_id")
    val collateralStatus = results.getString("collateral_status")
}

请注意,从 Corda V2 开始,在可能长时间 运行 的数据库操作期间不会对流设置检查点。