父级为null的父子关系的Hibernate条件查询(获取根条目)

时间:2015-07-21 17:37:39

标签: java hibernate parent-child criteria isnull

我在同一个班级有一个简单的父子关系。我喜欢得到没有父节点的所有实例(= 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();

感谢您提前提示

0 个答案:

没有答案