我有一个表示为实体的目录类型结构,即思考目录实体和文件实体。
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(我觉得它是一个内部联接获取)但没有运气。
有什么想法吗?
答案 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包含处理递归的方法。
希望这有帮助