JPAを使用して、オブジェクトの子孫を再帰的に照会する

私は列を持つPersonというテーブルを持っているとしましょう:

id, name, parent_id

このようなデータがあるとしましょう:

1, Bob, null
2, Mary, 1
3, Tim, 1
4, Sally, 3

ボブにはメアリーとティムの2人の子供がいます。 そしてTimには1人の子供がいます:Sally(祖父母はBobです)

Bobのすべての子孫を見つけることができるように、JPAクエリーを書く最も簡単な方法は何ですか?
(結果がMary、Tim、Sallyを返す)

ベストアンサー

私は単純なJPAでこれを行うことはできないと思います。

しかし、あなたがこのようにあなたのテーブルを変更することができれば

id, name, parent_path(string)

あなたのデータは次のようになります

1, Bob, null
2, Mary, 1
3, Tim, 1
4, Sally, 1/3
5, John, 1/3/4
6, Huge, 1/3/4/5

like節を使用してすべての子孫を照会することができます。 例えば:

select p from Person p where p.parentPath like '1/%'

ここでは1 – はparentPath + entityIdなので、Bobのような節のように見える

like '1/%'

BobのparentPathがnullでBobのidが1であるためです。

そして、Sallyの場合、クエリは次のようになります

select p from Person p where p.parentPath like '1/3/4/%'

SallyのparentPathが「1/3」で、SallyのIDが4であるためです。

新しい子を追加する必要がある場合は、parent_pathを設定するだけです

parent.parentPath + '/' + parent.id

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です