我有一个关于Hibernate的问题,是否有可能使用Criteria API和我正在使用的当前数据模型结构来实现查询。我有一个具有以下结构的数据模型:

ParentClass包含一个列表:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity =       org.test.ChildClass.class)
@JoinColumn(name = "child_uuid")
private List<ChildClass> childList = new ArrayList<ChildClass>();


子类具有一个字段:

private String testField


我尝试编写的查询可以表示如下:

返回具有“ testField”值为“ 1”的对象ChildClass缺席的所有ParentClass对象的列表。换句话说,该列表中不得存在testField值为1的对象。

目前,我有此查询:

    Criteria criteria = getSession().createCriteria(org.test.ParentClass);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

    criteria.createAlias("childList", "c");
    SimpleExpression expression = Restrictions.ne("c.testField", "1");
    criteria.add(expression);

    return (List<T>) criteria.list();


发生的事情是,我将获得任何包含至少一个ChildClass的父类对象,该子类的c.testField值不是“ 1”。这包括确实具有“ testField”值为“ 1”的ParentClass对象,我试图将其完全排除在外。

该表结构的ChildClass引用了ParentClass,反之亦然。因此,似乎每个ChildClass对象都与ParentClass结合在一起,如果它们满足上述限制,则返回ParentClass。这是错误的结果,因为这意味着将返回具有两个ChildClass对象的一个​​ParentClass对象,其中一个值为“ 1”,而另一个值为“ 2”。

谢谢你的帮助

最佳答案

您需要以下HQL查询的等效项:

select distinct p from Parent p
where not exists (select c.id from Parent p2 join p2.children c
                  where c.testField = '1' and p2.id = p.id)


您应该能够将其转换为“条件”(如果您确实要使用条件而不是使用更清晰的HQL查询)。您需要使用Subqueries.notExists()

关于java - 可以对具有 hibernate 条件的一对多关系执行NOT IN吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25584744/

10-10 18:27