Hibernate递归获取连接不递归获取所有子项

时间:2012-03-20 16:54:43

标签: java hibernate ejb

我有一个表示为实体的目录类型结构,即思考目录实体和文件实体。

Directory实体具有一组File实体和一组Directory实体。

我想获取根目录并“预加载”所有目录和文件。

我在尝试:

String queryString = "SELECT DISTINCT d FROM " + 
   Directory.class.getSimpleName() + 
   " d LEFT JOIN FETCH d.files LEFT JOIN FETCH d.directories child LEFT JOIN FETCH child.files LEFT JOIN FETCH child.directories WHERE f.root = :isRoot);
Query query = em.createQuery(queryString);
query.setParameter("isRoot", true);

Directory dir = (Directory) query.getSingleResult();

查询有效,它不会预加载所有内容。我得到所有根目录和根文件,但是当我开始进入子目录并获取文件查询时。 I.E.似乎递归不起作用。

我还尝试过一个JOIN FETCH(我觉得它是一个内部联接获取)但没有运气。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,但在我的情况下,一个表存储了多个独立的树。因此,“从节点n中选择n左连接提取n.Children”将在我需要单个树时将所有树提取到内存中。添加WHERE子句会破坏递归。

所以我在DAO中使用了一个递归助手:

private Node fetchChildren(Node parent) {
    Hibernate.initialize(parent.getChildren());
    for (Node child : parent.getChildren()) {
        fetchChildren(child);
    }
    return parent;
} 

答案 1 :(得分:0)

您是否已将实体之间的抓取定义为渴望( @OneToMany(fetch = FetchType.EAGER))?

它似乎可以解决您的问题的初始提取问题(more detailed answer)。

esaj comment link answer包含处理递归的方法。

希望这有帮助

相关问题