【问题标题】:JPA+Hibernate - dynamic OneToMany relation in EntityJPA+Hibernate - 实体中的动态 OneToMany 关系
【发布时间】:2019-09-01 06:40:57
【问题描述】:

我有一个实体类,它具有自引用关系 b/w 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

这个查询获取所有满足搜索条件的记录。在我的情况下,我只想要那些满足搜索条件的子记录,但在这里我也得到了那些不遵循它们正在显示的条件的子记录,因为它们有一个确实遵循这个搜索条件的父记录的引用。有什么方法可以只显示那些符合搜索条件的子记录?

【问题讨论】:

  • 添加PARENT_ID is not null 将导致仅获取属于某个父级的子级的记录。我认为这应该可以解决您的问题?

标签: java spring oracle hibernate jpa


【解决方案1】:

所以这是我的解决方案。

我没有找到一种 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());

}

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

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2021-05-22
    • 2019-01-12
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多