我在 postgres 数据库中有 3 个表,并且正在使用 R2dbc 以关系方式查询和连接它们。
我有 3 个实体类(可能不应该是数据类,但不应该影响示例)
@Entity
@Table(name = "parent", schema = "public", catalog = "Test")
data class MyParentObject(
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@org.springframework.data.annotation.Id
@Column(name = "id")
var id: Int = 0,
@Transient
var childData: List<MyChildObject>? = null
)
@Entity
@Table(name = "child", schema = "public", catalog = "Test")
data class MyChildObject(
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@org.springframework.data.annotation.Id
@Column(name = "id")
var id: Int = 0,
@Column(name = "parent_id")
var parentId: Int? = null
@Transient
var grandchildData: List<MyGrandchildObject>? = null
)
@Entity
@Table(name = "grandchild", schema = "public", catalog = "Test")
data class MyGrandchildObject(
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@org.springframework.data.annotation.Id
@Column(name = "id")
var id: Int = 0
@Column(name = "child_id")
var childId: Int? = null
)
父母是一对多的孩子,这是一对多的孙子。parent_id 和 child_id 就像 fkeys。
我有一个 RestController 可以通过这些方法返回填充了所有子数据的所有父数据
fun viewAllParents(): Mono<MutableList<MyParentObject>> =
parentRepository.findAll()
.flatMap { Mono.just(it).addChildData(it.id) }
.collectList()
fun Mono<MyParentObject>.addChildData(id: Int): Mono<MyParentObject> =
this.zipWith(childRepository.getAllByParentIdEquals(id).collectList())
.map {
it.t1.childData = it.t2
it.t1
}
而且我还有另一个 RestController 可以通过这些方法返回所有 ChildData 和所有 Grandchild 数据(与上面几乎相同)
fun viewAllChildren(): Mono<MutableList<MyChildObject>> =
childRepository.findAll()
.flatMap { Mono.just(it).addGrandchildData(it.id) }
.collectList()
fun Mono<MyChildObject>.addGrandchildData(id: Int): Mono<MyChildObject> =
this.zipWith(childOfChildRepository.getAllByChildIdEquals(id).collectList())
.map {
it.t1.childOfChildData = it.t2
it.t1
}
我不能做的是我的问题,我如何viewAllParents()
才能也填充孙子数据。我是否需要转换var grandchildData: List<MyGrandchildObject>
为 Flux 并使用来自 grandchildRepository 的新通量压缩它?还是我看错了?
任何指针将不胜感激。