【问题标题】:Query criteria for matching 3 of 6 fields匹配 6 个字段中的 3 个的查询条件
【发布时间】:2017-09-01 04:44:29
【问题描述】:

我想在 Corda (M14) 数据库中选择符合至少 3 个字段的条件的行,并通过匹配字段对这些结果进行排序。

这里是选择字段的 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))

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

谢谢,

卢普

【问题讨论】:

    标签: kotlin criteria corda


    【解决方案1】:

    我还没有测试过 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()
    

    【讨论】:

      【解决方案2】:

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

      1) 直接从 DatabaseTransactionManager 中获取 jdbcSession:

      val jdbcSession1 = DatabaseTransactionManager.current().connection
      

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

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

      &lt;dataSourceProperties&gt; 看起来像这样:

      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
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 谢谢,但 jdbcSession 不包含在 M14 中,这是我们 Cordapp 所基于的(最新)版本...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多