java Hibernate Criteria 查询集合包含某些元素

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27781010/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 12:23:05  来源:igfitidea点击:

Hibernate Criteria query Collections contains certain elements

javaspringcriteria-api

提问by maracili

I have some problems with Criteria. I have a Jobclass that contains a set of Skills.

我有一些问题Criteria。我有一个Job包含一组Skills.

The problem comes when I want to filter jobs that contain 2 skills, for example, all jobs that contains skill with id 1 and 3.

当我想过滤包含 2 个技能的工作时,问题就出现了,例如,所有包含 ID 为 1 和 3 的技能的工作。

Now I have this:

现在我有这个:

for (Skill skill : job.getSkills()) {
    ids.add(skill.getId());
}

criteria.createAlias("skills", "skill");
criteria.add(Restrictions.in("skill.id", ids));

but it gives me jobs that contain skill 1 or 3, not only those with both skills. How can I do this?

但它给了我包含技能 1 或 3 的工作,而不仅仅是那些同时具备这两种技能的工作。我怎样才能做到这一点?

UPDATE:

更新:

criteria.createAlias("Job.skills", "skill");    
Conjunction and = Restrictions.conjunction();   

for (Skill skill : job.getSkills()) {
    and.add(Restrictions.eq("skill.id", skill.getId()));
}
criteria.add(and);

I've tried this but the sql is and (skill1_.ID=? and skill1_.ID=?)with no results

我试过这个,但 sqland (skill1_.ID=? and skill1_.ID=?)没有结果

采纳答案by maracili

for(Skill skill:job.getSkills()){
                    DetachedCriteria subquery = DetachedCriteria.forClass(Skill.class,"skill");
                    subquery.add(Restrictions.eq("id",skill.getId()));
                    subquery.setProjection(Projections.property("id"));
                    subquery.createAlias("jobs", "job");
                    subquery.add(Restrictions.eqProperty("job.id", "Job.id"));
                    criteria.add(Subqueries.exists(subquery));  
                }

I managed to solve it.now it works.

我设法解决了它。现在它起作用了。

回答by WeMakeSoftware

Try this one:

试试这个:

criteria.createAlias("skills", "skill");

for(Skill skill:job.getSkills()){
    List<Long> wrappedParameter = new ArrayList<Long>();
    wrappedParameter.add(skill.getId());
    criteria.add(Restrictions.in("skill.id", wrappedParameter)));
}

回答by null

the result you are getting is expected. you are using Restrictions.inyou can use Criterion

你得到的结果是预期的。你正在使用Restrictions.in你可以使用Criterion

List<Criterion> restrictionList;
for(Skill skill :job.getSkills()){
    //ids.add(skill.getId());
    Criterion ctn=Restrictions.eq("skill.id", skill.getId());
    restrictionList.add(ctn);
}

criteria.createAlias("skills", "skill");
for (Criterion crit : restrictionList){
   criteria.add(crit);
}