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