【问题标题】:Get children for any level in tree structure but without theirs children using Hibernate?在树结构中获取任何级别的孩子,但没有他们的孩子使用 Hibernate?
【发布时间】:2020-06-02 04:26:25
【问题描述】:

我在 Hibernate 中有一个 Folder 实体,如下所示:

@Entity
@Table(name = "folders")
public class Folder {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "folder_id", unique = true, nullable = false)
    private int id;

    @NonNull
    @Column(name = "name", length = 100, unique = true, nullable = false)
    private String name;


    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parent", orphanRemoval = true)
    @Column(name = "sub_folders")
    private Set<Folder> childFolders = new HashSet<>();


    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JsonIgnore
    @JoinColumn(name = "parent", referencedColumnName = "folder_id", nullable = true)
    private Folder parent;

    public Folder() {
    }

}

我正在尝试编写一个查找器方法或自定义查询来执行我在主题中所写的操作。

因此,如果我发送一个类似于 folders/{parent_folder_id} 的请求,假设值是 1,我应该得到对象 45,但没有他们的孩子,所以不包括 6,7,8 and 9

理想情况下,最好使用休眠查询。如果没有,任何 sql 语言也可以。我会尝试让它进入休眠状态。

这就是我得到的,我还有孩子......

@Query(value = "Select * from folders f where f.parent = ?1 ", nativeQuery = true)
Set<Folder> getFolders(int folder_id);

【问题讨论】:

  • 对孩子使用 Lazy fetching
  • 是否将关系配置为惰性然后对查询中的第一级子级使用显式连接获取?
  • @JensSchauder 我尝试了其他一些具有惰性获取类型的查询,但没有奏效。我是休眠/春季新手。这是我得到的关闭,我什至不确定休眠的正确语法..
  • @MiljanPuletic 用于响应您使用的类。你能分享你的完整代码吗?

标签: mysql hibernate tree spring-data-jpa recursive-query


【解决方案1】:

我认为这应该可行:

  1. 使默认的 fetchtype 变得惰性:

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parent", orphanRemoval = true)
    @Column(name = "sub_folders")
    private Set<Folder> childFolders = new HashSet<>();
    
  2. 使用JOIN FETCH 以急切地获取您想要的关系。

    SELECT f FROM folders f JOIN FETCH f.childFolders
    

您可能可以使用实体图实现类似的效果,但我不确定它们与查询的交互。

【讨论】:

  • Danke Jens,我稍后再试,看看有什么效果,能不能搞定。
  • 我已经尝试过惰性获取并尝试过您的查询,但没有运气。收到查询格式不正确的错误。
  • 查询中有多余的空格。请重试。
【解决方案2】:

我得到了我需要的以下查询:

 @Query(value = "Select folder_id, name, parent From folders f Where f.parent = ?1", nativeQuery = true)

这只会给我文件夹的名称及其 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多