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
)
親は、孫の 1 対多である子に対して 1 対多です。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
}
そして、これらのメソッドを介して、すべての孫データ (上記とほぼ同じ) を含むすべての ChildData を返すことができる別の RestController があります。
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()
孫のデータも取り込むことができるかということです。Fluxに変換var grandchildData: List<MyGrandchildObject>
し、それを grandchildRepository からの新しいフラックスで圧縮する必要がありますか? それとも、私はこれを間違った方法で見ていますか?
どんなポインタでも大歓迎です。