簡體   English   中英

Hibernate父/子SELECT N + 1問題

[英]Hibernate Parent/Child SELECT N+1 issue

我jave下面的映射超類,它提供父/子自我關系的基本實現,以創建一個父/子列表,用於無限制嵌套項(即類別)

@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加載整個表,則單個select會加載所有記錄,我可以愉快地遍歷樹。 當我指定檢索樹上的節點時,我的問題就出現了。 我希望節點及其所有子節點在一個選擇中。 下面是用於加載整個表的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中指定對子項的連接,則應該能夠避免n + 1選擇。 我不確定,如果有辦法在HQL語句中指定批量大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM