Критерии запроса для сопоставления 3 из 6 полей

Я хотел бы выбрать строки в базе данных Corda (M14) с критериями, которые соответствуют по крайней мере 3 из 6 полей и отсортировать эти результаты по соответствующим полям.

Вот синтаксис 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)) 

Но я теперь застрял на том, как результаты GROUP тезисов по количеству совпадений полей и SORT эти, любые идеи?

Спасибо,

Loup

Для выпуска M14 у вас есть 2 варианта:

1) Получить jdbcSession непосредственно из DatabaseTransactionManager:

 val jdbcSession1 = DatabaseTransactionManager.current().connection 

2) Получите jdbcSession косвенно из объекта RequeryConfiguration:

 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 – например

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

Для расширенных пользовательских SQL-запросов рекомендуется использовать стандартную JDBCSession , JDBCSession из ServiceHub .

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