3

私のテーブルでは、Person オブジェクトは他の人物と関係を持つことができます。人の関係、次に関係の関係などを返す再帰的な手順を作成したいと思います。

Person私は2つの列を持つテーブルを持っていますPersonRelation.

PERSON         PERSON_RELATION   
id             id
name           person_id
age            relation_id
               relation_type           

私の PersonBeanImpl には、 Person の関係とその関係などのリストを (再帰的に) 返すメソッドがあります。

public List<Person> getPersonRelationsAndTheirRelations(int personId) {
     List<Person> relations = new ArrayList<>();
     getRelationsRecursivly(relations, personId);
     return relations;

}
private void getRelationsRecursivly(List<Person> relations, int personId) {
     relations.addAll(fetchPersonRelation(personId)); 
     for(Person p : relations){
         getRelationsRecursivly(relations, p.getId());
     }
}

public List<Person> fetchPersonRelation(int personId) {
     String sql = "SELECT p FROM Person p, PersonRelation pr WHERE pr.relationId = p.Id AND pr.personId = :personId";
     Query query = entityManager.createQuery(sql);
     query.setParameter(":personId", personId);
     return query.getResultList();
}

fetchPersonRelation()このコードは機能しますが、メソッドが何度も呼び出されるため、トランザクションを完了するには膨大な時間がかかります。

SQLだけですべてを再帰的に行うことは可能ですか? 私はPostgreSQLを使用しています。

SQLFiddle の例: http://sqlfiddle.com/#!12/c1f32/3

4

1 に答える 1