gpt4 book ai didi

java - hibernate "not in"问题

转载 作者:行者123 更新时间:2023-12-02 08:18:13 24 4
gpt4 key购买 nike

我正在尝试使用 hibernate Criteria 创建一个“not in”查询。我想要得到的是所有不知道这种语言的人,所以我有一个看起来像这样的实体:

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.not(Restrictions.in("id", values)));

这将返回所有人员,包括具有该语言的人员。

如果我尝试搜索了解特定语言的人员,则等效查询将返回正确的结果

Criteria cr = createCriteriaForPerson() // created criteria 

cr.createCriteria("languages").add(Restrictions.in("id", values));

可能是什么问题?

谢谢梅基斯

最佳答案

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

朴素的方法会生成如下查询:

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 与子查询一起使用(子查询的确切形式取决于您的数据库架构):

cr.add(Restrictions.sqlRestriction(
"not exists (select ... where l.person_id = {alias}.id and ...)"));

关于java - hibernate "not in"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5961879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com