3

在我的表中,Person 对象可以与其他人有关系。我想做一个递归过程,返回一个人的关系,然后是关系的关系等等。

我有一个有两列的表,Person并且PersonRelation.

PERSON         PERSON_RELATION   
id             id
name           person_id
age            relation_id
               relation_type           

在我的 PersonBeanImpl 我有一个方法,它返回一个人的关系列表以及他们的关系等等(recusrivly):

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

1

您可以使用递归公用表表达式来做到这一点。但它们有点棘手,所以你必须确保你不会陷入无限循环。但请记住,对于大型数据库,这意味着将每条记录都拉出来(六度分离)。

于 2013-07-10T17:24:01.697 回答