如何使用 VaultCustomQuery 查询父状态的嵌套集合中的字段

2023-12-14

我有一个一对多的关系,我试图在我的状态中添加对象/类的列表。 IE 我的合同状态包含附件列表List<Attachment>, where Attachment只是一个具有类似字段的类attachmentHash, uploadedDate, fileType

  1. 我想查询子项中的某些内容,但出现语法错误"AttachmentEntity is not a subtype of PersistentState"

    QueryCriteria.VaultCustomQueryCriteria(
    builder { (ContractSchemaV1.AttachmentEntity::uploadDate).equal(givenDate) })) 
    
  2. 我让 AttachmentEntity 成为PersistentState并且节点启动时出现错误

    org.hibernate.AnnotationException: net.corda.core.schemas.PersistentStateRef 
    must not have @Id properties when used as an @EmbeddedId: project.schemas.ContractSchemaV1$AttachmentEntity.stateRef
    

似乎我做错了什么,在状态中表示数据类集合并将其转换为模式的最佳方法是什么?或者这已经是正确的方法,但无法使用以下方式查询嵌套集合VaultCustomQuery?

下面的示例实体。

object ContractSchema

 object ContractSchemaV1 : MappedSchema(schemaFamily = ContractSchema.javaClass, version = 1,
    mappedTypes = listOf(ContractEntity::class.java, AttachmentEntity:class.java)) {
@Entity
@Table(name = "contracts")
class ContractEntity(

        @Column(name = "issued_date")
        var issuedDate: Instant,

        @Column(name = "linear_id")
        var linearId: String,

        @OneToMany(fetch = FetchType.LAZY, cascade = arrayOf(CascadeType.PERSIST))
        @JoinColumns(
                JoinColumn(name = "transaction_id", referencedColumnName = "transaction_id"),
                JoinColumn(name = "output_index", referencedColumnName = "output_index"))
        var attachments: MutableSet<AttachmentEntity> = emptyList(),

) : PersistentState()

@Entity
@Table(name = "attachments")
class AttachmentEntity (

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    var id: Long? = null,

    @Column(name = "attachment_hash", nullable = false)
    var attachmentHash: String? = null,

    @Column(name = "attachment_name", nullable = false)
    var attachmentName: String? = null,

    @Column(name = "upload_date", nullable = true)
    var uploadDate: Instant? = null)
}

您的架构定义是正确的(您可以在此处查看另一个示例:查询 LinearState 状态中的嵌套集合).

但是,不支持查询嵌套集合VaultCustomQueryCriteria。您必须执行直接 JDBC 查询来查询嵌套集合的属性。

下面是 Corda 中直接 JDBC 查询的示例:

@Test
fun `test calling an arbitrary JDBC native query`() {
    val nativeQuery = "SELECT v.transaction_id, v.output_index FROM vault_states v WHERE v.state_status = 0"

    database.transaction {
        val jdbcSession = services.jdbcSession()
        val prepStatement = jdbcSession.prepareStatement(nativeQuery)
        val rs = prepStatement.executeQuery()
        var count = 0
        while (rs.next()) {
            val stateRef = StateRef(SecureHash.parse(rs.getString(1)), rs.getInt(2))
            Assert.assertTrue(cashStates.map { it.ref }.contains(stateRef))
            count++
        }
        Assert.assertEquals(cashStates.count(), count)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 VaultCustomQuery 查询父状态的嵌套集合中的字段 的相关文章

随机推荐

  • 如何在 R 中保存 data.frame?

    我在 R 中制作了一个不是很大的 data frame 但构建起来需要相当长的时间 我想将它保存为一个文件 然后我可以在 R 中再次打开它吗 有几种方法 一种方法是使用save 保存确切的对象 例如用于数据框foo save foo fil
  • 仅解析大型 JSON 字符串中的一个字段

    我有一个以下格式的 JSON 字符串 foo small vale baz large value bar another large value 如何高效提取foo而忽略其余字段 基本上 我使用 Gson 并定义了一个 精益类 如下所示
  • QWebEngineView 中的 Qt 事件传播

    我有一个名为generate input event 我正在尝试使用此函数来模拟 QWebEngineView 中的按键 def generate input event window id key code modifiers low l
  • 验证和认证的区别?

    如您所知 我们通过以下方式向卡证明我们是真实用户INITIAL UPDATE and EXTERNAL AUTHENTICATION命令 如下 lt 80 50 00 00 08 Host Challenge gt lt 84 82 03
  • Android Proguard SqlCipher NoClassDefFoundError

    一整天都在与 Proguard 作斗争 并在 Proguard 官方网站以及 StackOverflow 上尝试了许多示例和解决方案 我有一个需要混淆的大型项目 其中有许多引用的库项目和 Jars 我从 2 个库 com google co
  • 在没有“编辑”按钮的情况下在表格视图中编辑操作?

    我想在我的表格视图 加载时 中显示所有行 并带有红色标记 负号 UITableViewCellStateShowingDeleteConfirmationMask 换句话说 如果我单击红色标记 它必须在表视图中显示该特定行的删除按钮 编辑按
  • ExtJS。隐藏容器内的所有组件

    我有一个窗口 在其中渲染许多组件 例如面板等 有没有办法可以隐藏窗口中包含的所有组件 而不必单独隐藏它们 就像是 Ext getComponent myWindow hideAllComponents 我正在使用 extjs 3 4 如果我
  • 'false'可以匹配mysql中的某个字符串吗?

    我有一个这样的表 CREATE TABLE IF NOT EXISTS session id int 11 NOT NULL AUTO INCREMENT token varchar 32 NOT NULL profile varchar
  • 如何像 Ola 应用程序一样在 Google 地图上移动标记

    我正在开发像 Ola cabs 这样的应用程序 当用户拖动地图时 会出现一个视图透明视图 并且标记会移动 当用户停止拖动时 我们必须将 gmscamera 位置居中 就像 ola cab 应用程序一样 这是未拖动地图时的图像 拖动后 我使用
  • 为什么setParameter没有设置参数?

    我正在使用以下代码 尝试 查询数据库 Query query session createQuery from Trace where service service query setParameter service clientReq
  • 警告:mysqli_connect():(HY000/1045):用户“root”@“localhost”的访问被拒绝(使用密码:NO)[重复]

    这个问题在这里已经有答案了 PHP 警告 mysqli connect HY000 1045 用户访问被拒绝 root localhost 使用密码 NO G PleskVhosts peacewithoutlimits org httpd
  • 是否可以从 C++ 调用 Dart 方法?

    如何从C 代码中调用Dart方法 我想尝试在我的应用程序中使用 Dart 作为脚本语言 你有两种可能性 首先 你可以将 Dart VM 嵌入到您的 C 程序中 See 这次讨论 有一个 GitHub 示例 这允许您用 C 编写程序并运行 D
  • 在 sas 宏文件名管道中使用引号

    我正在使用以下使用文件名管道的宏 但出现错误 提示无效选项名称 dir 等 我怀疑这可能是由于定义文件名和管道时的引号所致 我想它会将其识别为一个选项 我尝试删除引号 删除 bquote 并仅使用双引号 但仍然不断出现错误 我正在使用 Wi
  • 读取序列时未创建输出文件

    因此 当它运行时 应该将 fasta 文件的输出缩短为几个序列 并将该输出放入文本文件中 但我遇到的问题是输出文件未创建 我不知道是什么错误在脚本内 我将在下面发布我的代码以供参考 感谢您阅读本文 如果您愿意的话 usr bin perl
  • 使用 jQuery 修改表结构(合并单元格)

    我有一张桌子 table tr td 9 00 td td task1 td tr tr td 10 00 td td td tr tr td 11 00 td td task2 td tr tr td 12 00 td td task3
  • Java 转义 HTML - 字符串替换慢?

    我有一个 Java 应用程序 它大量使用大文件来读取 处理并传递给 SolrEmbeddedServer http lucene apache org solr 其中一个函数执行基本的 HTML 转义 private String html
  • Autodesk Forge:工作项因 AppPackage 问题而失败

    我的 AppPackage 无法加载 并且我无法在文档或错误消息 代码中找到确切的答案 我通过将其解压缩到本地计算机上的 C Program Files Autodesk ApplicationPlugins 中来测试该捆绑包 并且它按预期
  • 如何取消引用哈希引用

    更新 我所知道的关于引用 取消引用的一切都来自这里 http www thegeekstuff com 2010 06 perl array reference examples 我正在使用一个库 来自库文档 Returns a refer
  • 如何在 Eclipse 3.8 中安装 Perforce 插件

    如何在 Eclipse 3 8 中安装 Perforce 插件 P4Eclipse 必然插件和集成页面仅列出 Eclipse 4 2 到 4 4 Eclipse 3 8 是 Ubuntu 14 04 存储库中提供的版本 最新版本的 P4Ec
  • 如何使用 VaultCustomQuery 查询父状态的嵌套集合中的字段

    我有一个一对多的关系 我试图在我的状态中添加对象 类的列表 IE 我的合同状态包含附件列表List