gpt4 book ai didi

java - Hibernate Parent/Child SELECT N+1 问题

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

我拥有以下映射父类(super class),它为父/子自身关系提供基本实现,以创建用于无限嵌套项目(即类别)的父/子列表

@MappedSuperclass
public abstract class ParentChildPathEntity<N extends ParentChild> implements MaterializedPath<N> {


@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "parent_id")
private N parent;

@Column(name = "name", unique = true)
private String name;

@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<N> children = new HashSet<N>();

如果我在父表和子表上使用 fetch join 加载整个表,单个选择将加载所有记录,我可以愉快地遍历树。当我指定检索树上的节点时,我的问题就出现了。我希望节点及其所有子节点都在一次选择中。下面是加载整个表的 hql:

hql.append(String.format("tree from %s tree ", tableName));
hql.append("left join fetch tree.parent ");
hql.append("left join fetch tree.children ");

如果我指定节点名称,即:

where tree.name = :name

然后 hibernate 检索节点,但是当我访问子节点时,我遇到了 SELECT N+1 问题。我知道为什么会这样(因为 tree.name = :name)但是有没有办法编写 HQL 以便它加载指定的节点及其所有子节点?

我只是想找出一种方法来支持一个简单的嵌套项目列表,我可以在其中通过一次选择检索任何父节点及其子节点

提前致谢,

最佳答案

您是否尝试过使用@BatchSize 注释?

@BatchSize(size = 20)

例如:

@OneToMany(mappedBy = ..., fetch = FetchType.LAZY)
@BatchSize(size = 20)
public SortedSet<Item> getItems() { ... }

然后,如果你在你的 HQL 中指定了对 child 的连接,你应该能够避免 n+1 选择。我不确定是否有办法在 HQL 语句中指定批量大小。

关于java - Hibernate Parent/Child SELECT N+1 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391386/

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