Hibernate Criteria 查询 Collections 包含某些元素
Hibernate Criteria query Collections contains certain elements
我在使用 Criteria
时遇到一些问题。我有一个 Job
class 包含一组 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=?)
没有结果
试试这个:
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)));
}
您得到的结果符合预期。您正在使用 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);
}
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));
}
我设法解决了 it.now 它有效。
我在使用 Criteria
时遇到一些问题。我有一个 Job
class 包含一组 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=?)
没有结果
试试这个:
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)));
}
您得到的结果符合预期。您正在使用 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);
}
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));
}
我设法解决了 it.now 它有效。