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

时间:2018-02-06 07:57:59

标签: hibernate corda

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

注释@Entity架构类之后,不知道为什么我收到此错误

1 个答案:

答案 0 :(得分:1)

流不会公开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开始,在可能长时间运行的数据库操作期间,流量不会被检查点。