我们如何使用Corda提供的VaultQuery API运行带有EXISTS子句的子查询?

我们如何使用Corda提供的VaultQuery API运行带有EXISTS子句的子查询?,corda,Corda,我有以下配置的状态 data class NodeState( override val linearId: UniqueIdentifier = UniqueIdentifier(), val name: CordaX500Name, val active: Boolean, val services: List<Service>):LinearState, QueryableState 我们如何使用Corda提供的VaultQuery API来

我有以下配置的状态

data class NodeState(
    override val linearId: UniqueIdentifier = UniqueIdentifier(),
    val name: CordaX500Name,
    val active: Boolean,
    val services: List<Service>):LinearState, QueryableState 

我们如何使用Corda提供的VaultQuery API来运行包含EXISTS子句的子查询???

这在当前的
VaultQuery
API中是不可能的,这里有文档记录:。您必须直接连接到节点的数据库并发出SQL查询

可以从流中执行此操作,如下所示:

// Connecting to the node's database.
val session = serviceHub.jdbcSession()

// Writing to the node's database.
val preparedStatementWrite = session.prepareStatement("update my_table set value = ? where key = ?")
preparedStatementWrite.setInt(0, 100)
preparedStatementWrite.setString(1, "my_key")
preparedStatementWrite.executeUpdate()

// Reading from the node's database.
val preparedStatementRead = session.prepareStatement("select value from my_table where key = ?")
preparedStatementRead.setString(0, "my_key")
preparedStatementRead.executeQuery()

您也可以使用标准Java从节点外部执行此操作。

对于我们这些不太熟悉SQL的人,您能用简单的英语重申SQL查询吗?我有一个包含B对象集/列表的状态对象A。通过保险库查询服务,我想查询在B列表中包含给定值的任何状态A,该状态A是否可以通过此选项进行回答?JDBC连接和运行普通的旧SQL查询无法通过CordaRPCClient使用。短期内可能会检查接口CordaRPCClient,但当我们将REST层与Corda层分离时,建议使用CordaRPCClient进行CRUD操作。我强烈建议在CordaRPCClient/CordaRPCOps和vault服务中添加更多可用功能。
SELECT * FROM NODE_STATE as A where EXISTS (select * from NODE_SERVICES as B where B.TRANSACTION_ID = A.TRANSACTION_ID AND B.SERVICE = 'LEAD_COUNSEL')
// Connecting to the node's database.
val session = serviceHub.jdbcSession()

// Writing to the node's database.
val preparedStatementWrite = session.prepareStatement("update my_table set value = ? where key = ?")
preparedStatementWrite.setInt(0, 100)
preparedStatementWrite.setString(1, "my_key")
preparedStatementWrite.executeUpdate()

// Reading from the node's database.
val preparedStatementRead = session.prepareStatement("select value from my_table where key = ?")
preparedStatementRead.setString(0, "my_key")
preparedStatementRead.executeQuery()