匹配6个字段中的3个的查询条件

Query criteria for matching 3 of 6 fields

我想 select Corda (M14) 数据库中的行,其条件与 6 个字段中的至少 3 个匹配,并通过匹配字段对这些结果进行排序。

这是 select 字段的 SQL 语法:

WHERE (field1 = ?) + (field2 = ?) + (... = ?) > 3

并订购:

ORDER BY ((field1 = ?) + (field2 = ?) + (... = ?)) DESC

另一种方法:

SELECT *, ((field1 = @inputFirst) + (field2 = @inputLast)) as Matches
FROM mytable
HAVING Matches > 1
ORDER BY Matches DESC

我开始创建条件:

vaultCriteria
            .or(QueryCriteria.VaultCustomQueryCriteria(field1))
            .or(QueryCriteria.VaultCustomQueryCriteria(field12))
            .or(QueryCriteria.VaultCustomQueryCriteria(field3))

但我现在卡在如何按字段的匹配编号对这些结果进行分组并对其进行排序,有什么想法吗?

谢谢,

循环

对于高级自定义 SQL 查询,建议您使用标准 JDBCSession,可从 ServiceHub.

获得

请参阅https://docs.corda.net/head/api-persistence.html?highlight=jdbcsession

对于 M14 版本,您有 2 个选项:

1) 直接从 DatabaseTransactionManager 获取一个 jdbcSession:

val jdbcSession1 = DatabaseTransactionManager.current().connection

2) 从 RequeryConfiguration 对象间接获取 jdbcSession:

val jdbcSession2 = RequeryConfiguration(<dataSourceProperties>).jdbcSession()

其中 <dataSourceProperties> 看起来像这样:

private fun makePersistentDataSourceProperties(): Properties {
    val props = Properties()
    props.setProperty("dataSourceClassName", "org.h2.jdbcx.JdbcDataSource")
    props.setProperty("dataSource.url", "jdbc:h2:~/test/vault_query_persistence;DB_CLOSE_ON_EXIT=TRUE")
    props.setProperty("dataSource.user", "sa")
    props.setProperty("dataSource.password", "")
    return props
}

我还没有测试过 API 可以走多远,但我已经通过编写自定义 SQL 取得了成功(在当前 Master 上)——例如

        val session = services.jdbcSession()
        val consensusQuery = """
        SELECT COUNT(*) - COUNT(NULLIF(factObject, ?)), COUNT(*)
        FROM submission_states
        WHERE factSubject = ? AND factPredicate = ?
        """
        val consensusStatement = session.prepareStatement(consensusQuery)

        consensusStatement.setString(1, factConsensusQuery.factObject)
        consensusStatement.setString(2, factConsensusQuery.factSubject)
        consensusStatement.setString(3, factConsensusQuery.factPredicate)

        log.info("SQL to execute: " + consensusStatement.toString())
        val rs = consensusStatement.executeQuery()