I have some problems with Criteria
. I have a Job
class that contains a set of 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.
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?
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
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)));
}
the result you are getting is expected. you are using Restrictions.in
you can use 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);
}
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.