我有一个班级:
@Entity
public class Resume {
private Long id;
@Embedded
private DesiredPositionAndSalary desiredPositionAndSalary;
}
和班级:
@Embeddable
public class DesiredPositionAndSalary {
@ManyToMany
private Set<Specialization> specializations;
}
和上课;)
@Entity
public class Specialization {
private Long id;
}
现在我有一些我需要过滤的专业化。 例如,我需要选择所有简历与程序员或经理之类的专业化。像
这样的东西select * from resume r inner join resume_to_specialization rts on r.id = rts.id inner join specialization s on rts.spec_id in(1,2)
如何在Criteria api中编写此查询?如果我错过了一些重要细节,我可以提供更多。
答案 0 :(得分:0)
好的,我用这个来处理它:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Resume> cq =cb.createQuery(Resume.class);
Root<Resume> root = cq.from(Resume.class);
cq.select(root);
Set<Specialization> filter = getFilter();
SetJoin<DesiredPositionAndSalary, Specialization> join = root.join(Resume_.desiredPositionAndSalary, JoinType.INNER).join(
DesiredPositionAndSalary_.specializations, JoinType.INNER);
cq.where(cb.and(cq.getRestriction(), join.in(filter)));
cq.distinct(true);/*it is major, or we get duplicate of resume for every
specialization overlap with filter*/
List<Resume> result = em.createQuery(cq).getResultList();