【问题标题】:How do we use Corda provided VaultQuery API to run a subquery with EXISTS clause?我们如何使用 Corda 提供的 VaultQuery API 来运行带有 EXISTS 子句的子查询?
【发布时间】:2018-06-08 19:31:32
【问题描述】:

我有以下配置的状态

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

我的持久架构正在跟踪

class PersistentNodeState(
        @Column(name = "linearId")
        var linearId: String,

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

        @Column(name = "active")
        var active: Boolean,

        @ElementCollection(fetch = FetchType.EAGER)
        @CollectionTable(name = "node_services",
                joinColumns = arrayOf(
                        JoinColumn(name = "output_index", referencedColumnName = "output_index"),
                        JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id")
                )
        )
        @Column(name = "service")
        var services: Set<String>

现在我想使用类似于以下 SQL 查询的 VaultQuery 查询状态。我该怎么做?

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')

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

【问题讨论】:

  • 对于我们这些不太熟悉 SQL 的人,您能用简单的英语重述那个 SQL 查询吗?
  • 我的状态对象 A 包含 B 对象的集合/列表。通过保险库查询服务,我想查询在 B 列表中包含给定值的任何州 A
  • JDBC 连接和运行普通 OLD SQL 查询无法通过 CordaRPCClient 获得。检查接口 CordaRPCOps
  • 短期可能会,但是当我们将 REST 层与 Corda 层分离时,推荐的方法是使用 CordaRPCClient 进行 CRUD 操作。我强烈建议在 CordaRPCClient/CordaRPCOps 和保管库服务中添加更多可用功能。

标签: corda


【解决方案1】:

当前的VaultQuery API 无法做到这一点,此处记录:https://docs.corda.net/api-vault-query.html。您必须直接连接到节点的数据库并发出 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 从节点外部执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多