在我的表中,Person对象可以与其他人有关系。我想做一个递归过程,返回一个人的关系,然后是关系的关系等等。
我的表格有两列Person
和PersonRelation
。
PERSON PERSON_RELATION
id id
name person_id
age relation_id
relation_type
在我的PersonBeanImpl中,我有一个方法,它返回一个Person关系列表以及它们的关系等等(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
答案 0 :(得分:1)
您可以使用recursive common table expressions执行此操作。但它们有点棘手,所以你必须确保你没有得到无限循环。但请记住,对于一个大型数据库,它将意味着从中提取每条记录(Six degrees of seperation)。