跳到主要内容

其它功能

保存指令返回结果

保存指令返回的结果是一个对象,例如,对于保存单个对象的对象的save方法而言,其返回类型为SimpleSaveResult<E>/KSimpleSaveResult<E>

该结果存支持如下行为:

  • originalEntity属性:返回开发人员传递给save方法的原始参数。

  • modifiedEntity属性:形状和originalEntity完全一样的数据结构,二者区别在于

    • 如果originalEntity中包含一些没有id属性的对象,依赖于id自动生成策略 (例如:自动编号,序列,UUID, 雪花id)modifiedEntity中对应的对象必然具备id属性,其值为数据库/应用为其自动分配的值。

    • 如果某些对象所属实体类型具备乐观锁字段,modifiedEntity中对应的对象的version属性比为修改后数据中最新版本号。

    信息

    modifiedEntity在前面的文档中多次讨论,本文不予讨论。

  • totalAffectedRowCount属性:保存指令的执行可能导致数据库中多张表被修改,此属性为一个证书,表示所有被修改的表的影响行数之和。

  • getAffectedRowCountMap属性:被影响的表和其影响行数形成的Map。

  • getAffectedRowCount方法,给定一个参数,获取指定表的影响行数。接受两种参数

    • 类型:获取该实体对应的表的影响行数

    • 基于中间表的关联属性:获取该关联属性对应的中间表的影响行数

让我们来看看totalAffectedRowCount属性和getAffectedRowCount方法的例子

SimpleSaveResult<Book> result = sqlClient.update(
Objects.createBook(draft -> {
draft.setId(3L);
draft.setPrice(new BigDecimal("59.9"));
draft.addIntoAuthors(author -> author.setId(1L));
draft.addIntoAuthors(author -> author.setId(3L));
draft.addIntoAuthors(author -> {
author.setId(1000L); // 不存在,自动创建
author.setFirstName("Svetlana");
author.setLastName("Isakova");
author.setGender(Gender.FEMALE);
});
})
);
System.out.println(
"总影响行数: " +
result.getTotalAffectedRowCount()
);
System.out.println(
"实体表BOOK的影响行数: " +
result.getAffectedRowCount(Book.class)
);
System.out.println(
"实体表AUTHOR的影响行数: " +
result.getAffectedRowCount(Author.class)
);
System.out.println(
"中间表BOOK_AUTHOR_MAPPING的影响行数: " +
result.getAffectedRowCount(BookProps.AUTHORS)
);
提示

例子中的写法getAffectedRowCount(BookProps.AUTHORS)和另外一种写法getAffectedRowCount(AuthorProps.BOOKS)等价

打印结果为:

总影响行数: 5
实体表BOOK的影响行数: 1
实体表AUTHOR的影响行数: 1
中间表BOOK_AUTHOR_MAPPING的影响行数: 3

解释如下:

  • BOOK表的影响行数为1:

    聚合根对象Book(id=3L)price被修改

  • AUTHOR表的影响行数为1:

    长关联对象Author(id=1000L)不存在,自动创建

  • BOOK_AUTHOR_MAPPING表的影响行数为3:

    • Book(id=3L)Author(id=2L)之间脱钩 (对中间表脱钩操作而言,就是删除关联)

    • Book(id=3L)Author(id=3L)之间新建关联

    • Book(id=3L)Author(id=1000L)之间新建关联