2017-08-31 55 views
1

我希望在Corda(M14)數據庫中選擇符合6個字段中至少3個的條件的行,並通過匹配字段對這些結果進行排序。用於匹配6個字段中的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)) 

但我現在被困在如何將這些結果按字段的匹配號進行分組,並將這些分類,任何想法分類?

謝謝

盧普

回答

1

對於M14版中,你有兩個選擇:

1)直接從DatabaseTransactionManager得到一個jdbcSession:

val jdbcSession1 = DatabaseTransactionManager.current().connection 

2)從RequeryConfiguration對象間接獲取一個jdbcSession :

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

其中<dataSourceProperties>看起來是這樣的:通過編寫自定義SQL

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 
} 
2

我沒有測試它在多大程度上是可能採取的API,但我已經成功(目前碩士) - 例如

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