Java 冬眠“;不在「;问题

Java 冬眠“;不在「;问题,java,hibernate,criteria,Java,Hibernate,Criteria,我正在尝试使用hibernate条件创建一个“不在”查询。我想得到的是所有不懂这种语言的人,所以我有一个实体,看起来像: public class Person { ... private List<Language> languages; ... } public class Language { public Long id; public String label; } 这将返回所有人,包括使用该语言的人 如果我试图搜索知道特定语言

我正在尝试使用hibernate条件创建一个“不在”查询。我想得到的是所有不懂这种语言的人,所以我有一个实体,看起来像:

public class Person {
    ...
    private List<Language> languages;
    ...
}

public class Language {

    public Long id;
    public String label;
}
这将返回所有人,包括使用该语言的人

如果我试图搜索知道特定语言的人,那么等价的查询将返回正确的结果

Criteria cr = createCriteriaForPerson() // created criteria 

cr.createCriteria("languages").add(Restrictions.in("id", values));
有什么问题吗

谢谢
Makis

我非常确定,如果不使用
sqlRestriction
,就无法在CriteriaAPI中表达此查询

Naive方法生成如下查询:

select p from Person p join p.languages l where l.id not in :values
这显然不是你想要的,因为其他语言仍然被选中

要表达所需的查询,您需要一个复杂的联接

select p from Person p left join p.languages l with l.id in :values where l is null
或子查询

select p from Person p where not exists 
    (select l from Language l where l in elements(p.languages) and l.id in :values)
由于Criteria API不支持附加条件的联接,因此表示此查询的唯一方法是将
sqlRestriction
与子Qery一起使用(子Qery的确切形式取决于您的数据库架构):

select p from Person p where not exists 
    (select l from Language l where l in elements(p.languages) and l.id in :values)
cr.add(Restrictions.sqlRestriction(
    "not exists (select ... where l.person_id = {alias}.id and ...)"));