其它功能
保存指令返回结果
保存指令返回的结果是一个对象,例如,对于保存单个对象的对象的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
方法的例子
- Java
- Kotlin
SimpleSaveResult<Book> result = sqlClient.update(
Immutables.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)
);
val result = sqlClient.update(
Book {
id = 3L
price = BigDecimal("59.9"))
authors().addBy { id = 1L }
authors().addBy { id = 3L }
authors().addBy {
id = 1000L // 不存在,自动创建
firstName = "Svetlana"
lastName = "Isakova"
gender = Gender.FEMALE
}
}
);
println(
"总影响行数: " +
result.totalAffectedRowCount
)
println(
"实体表BOOK的影响行数: " +
result.getAffectedRowCount(Book::class)
)
println(
"实体表AUTHOR的影响行数: " +
result.getAffectedRowCount(Author::class)
)
println(
"中间表BOOK_AUTHOR_MAPPING的影响行数: " +
result.getAffectedRowCount(Book::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)
之间新建关联
-