如何在Criteria api中创建查询

时间:2013-08-21 15:58:31

标签: jpa-2.0 criteria-api

我有一个班级:

@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中编写此查询?如果我错过了一些重要细节,我可以提供更多。

1 个答案:

答案 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();