【发布时间】:2022-01-09 09:32:14
【问题描述】:
我在 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 的行为类似于 fkey。
我有一个 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 的新通量对其进行压缩?还是我看错了?
任何指针将不胜感激。
【问题讨论】:
-
您想要返回整个层次结构吗?即父母-> 孩子-> 孙子或想基本上只是带着孙子返回父母??。我问的原因是..你想维护(父母->孩子->孙子)的层次结构还是只想报告父母下的孙子
-
嘿@Harry 感谢您的评论。从长远来看,两者都 - 但现在,我想获得整个层次结构
标签: kotlin project-reactor spring-data-r2dbc r2dbc r2dbc-postgresql