gpt4 book ai didi

java - JPA+Hibernate - 实体中的动态 OneToMany 关系

转载 作者:行者123 更新时间:2023-12-02 01:04:38 26 4
gpt4 key购买 nike

我有一个实体类,它具有黑白 ID(主键)和 PARENT_ID 的自引用关系。

@Entity
@Table(name = "DIRECTORY")
public class DirectoryEntity{


@Id
@Column(name = "ID")
private Integer id;


@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID", nullable = true)
private Set<DirectoryEntity> children;
}

当我获取记录时,一切工作正常,它将子记录映射到子数组。但我遇到了以下查询的情况。

        SELECT 
dqlist.*,
score(1) AS rank
FROM
DIRECTORY dqlist
WHERE
contains(dqlist.ESTABLISHMENT_NAME_EN,'definescore(fuzzy("SEARCH_TEXT", 1, 6, weight),relevance)',1) > 0 )
ORDER BY
rank DESC

该查询获取所有满足搜索条件的记录。就我而言,我只想要那些满足搜索条件的子记录,但在这里我也得到了那些不符合它们所显示的条件的子记录,因为它们具有遵循此搜索条件的父记录的引用。有什么方法可以让我只显示那些符合搜索条件的子记录?

最佳答案

这是我的解决方案。

我没有找到 JPA 方法来解决我的问题,并且自加入对于我的情况也存在一些性能问题。所以我所做的就是编写一个查询,返回所有符合搜索条件的记录及其父记录,并在代码中映射父子关系。

这是我的代码,它将子对象映射到其父对象:

    public List<DirectoryEntity> convertListToTree(List<DirectoryEntity> records){
Map<Integer,DirectoryEntity> treeMap = new HashMap<>();
treeMap = records.stream()
.collect(Collectors.toMap(DirectoryEntity::getId, x -> x));
if(!treeMap.isEmpty() && !records.isEmpty()) {
for (Iterator<DirectoryEntity> iterator = records.iterator(); iterator.hasNext();) {
DirectoryEntity record = iterator.next();
System.out.println("ID: " +record.getId()+ " PARENT_ID: " + record.getParentId());
Integer parentId = record.getParentId();
if(parentId!=null) {
DirectoryEntity parentRecord = treeMap.get(parentId);
if(parentRecord!=null) {
if(parentRecord.getChilds()==null) {
parentRecord.setChilds(new HashSet<>());
parentRecord.getChilds().add(record);
}else {
parentRecord.getChilds().add(record);
}

}
}
}
}
return treeMap.values()
.stream()
.filter(x->x.getParentId()==null)
.collect(Collectors.toList());

}

如果有人有更好的解决方案,请随时回答,我将非常感激。 :)

关于java - JPA+Hibernate - 实体中的动态 OneToMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743762/

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