我在同一个班级有一个简单的父子关系。我喜欢得到没有父节点的所有实例(= NULL)。查看“根”类别。
我需要使用条件查询,不能使用HQL或SQL。由于issue with Relationship and "isNull" Operation,标准查询似乎无法“正常”按预期使用并需要一些技巧。任何人都有任何我可以尝试的提示吗?
@Entity
public class Category {
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(cascade=CascadeType.ALL, mappedBy="parent", fetch=FetchType.EAGER)
@OrderBy(value="pos")
private List<Category> childs = new ArrayList<Category>();
...
}
如果我使用以下条件查询构造,我会得到奇怪的结果。我得到多次相同的类别实例而不是“root”实例。
Criteria c = session.createCriteria(Category.class, "c");
c.add(Restrictions.isNull("c.parent"));
List<Category> rootCategories = c.list();
for(Category category : rootCategories) {
logger.info(category);
}
我已经尝试了一些带别名但没有运气的构造。左连接或内连接不起作用;(
Criteria c = session.createCriteria(Category.class, "c");
c.createAlias("c.parent", "p", JoinType.RIGHT_OUTER_JOIN);
c.add(Restrictions.isNull("p.id"));
List<Category> rootCategories = c.list();
for(Category category : rootCategories) {
logger.info(category);
}
如果我使用HQL(遗憾的是我的问题没有选择),它可以很好地运行
List<Category> rootCategories = session.createQuery("FROM Category c where c.parent is null order by c.pos").list();
感谢您提前提示