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

时间:2015-01-05 13:54:30

标签: java spring criteria-api

Criteria我遇到了一些问题。我有一个Job类,其中包含一组Skills

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

现在我有了这个:

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

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

但它给了我包含技能1或3的工作,而不仅仅是那些兼具技能的人。 我怎么能这样做?

更新

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);

我已经尝试了这个但是sql是and (skill1_.ID=? and skill1_.ID=?)但没有结果

3 个答案:

答案 0 :(得分:1)

试试这个:

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)));
}

答案 1 :(得分:0)

您获得的结果是预期的。您使用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);
}

答案 2 :(得分:0)

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));  
                }

我设法解决了它。现在它有效。