【问题标题】:how to create query in Criteria api如何在 Criteria api 中创建查询
【发布时间】:2013-08-21 15:58:30
【问题描述】:

我有一堂课:

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

【问题讨论】:

    标签: jpa-2.0 criteria-api


    【解决方案1】:

    好的,我用这个来处理:

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

    .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多