gpt4 book ai didi

java - 如何使用 SQL 进行递归调用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:29 25 4
gpt4 key购买 nike

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

我有一个包含两列的表,PersonPersonRelation

PERSON         PERSON_RELATION   
id id
name person_id
age relation_id
relation_type

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

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

最佳答案

你可以用 recursive common table expressions 做到这一点.但是它们有点棘手,因此您必须确保不会出现无限循环。但请记住,对于大型数据库而言,这意味着从中提取每条记录 (Six degrees of seperation)。

关于java - 如何使用 SQL 进行递归调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com