Как мы используем предоставляемый Corda VaultQuery API для запуска подзапроса с предложением EXISTS? - PullRequest
0 голосов
/ 26 мая 2018

У меня есть состояние со следующей конфигурацией

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>

Теперь я хотел бы запросить состояние с помощью VaultQuery, аналогично следующему запросу SQL.Как мне это сделать?

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 ??

1 Ответ

0 голосов
/ 08 июня 2018

Это невозможно с текущим 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.

...