JPA使用between子句查询集合

时间:2014-04-15 15:39:59

标签: java jpa persistence criteria

我的实体拥有另一个实体的集合,我需要在该实体上执行BETWEEN条件。 我不想使用本机查询。 我正在尝试使用条件API实现此目的。

以下是我的实体的简短片段。

@Entity
@Table(name = "ref_dates")
public class Dates{
    @Id
    @Column(name = "ID")
    private int id;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinTable(
    name="ref_dates_prg",
    joinColumns = @JoinColumn( name="DATE_PRG_ID"),
    inverseJoinColumns = @JoinColumn( name="DATE_ID")
 )    
 private Set<DateInfo> dates;

}

它有几个其他属性,geter / setter等,我在这里没有提到。 我需要使用Set子句对此DateInfo中的between对象中的id进行查询。 我尝试使用Expression<Set<DateInfo>>但未到达任何地方。 感谢您的帮助。

这是我的标准建立。

final CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

final CriteriaQuery<NetPrgTimePeriod> criteriaQuery = criteriaBuilder.createQuery(Dates.class);

List<Predicate> criteriaList = new ArrayList<Predicate>();

final Root<Dates> root = criteriaQuery.from(Dates.class);

Join<Dates, DateInfo> dateJoin = root.join("dates", JoinType.LEFT);

Predicate runDatesRange = criteriaBuilder.between(
        dateJoin.<Integer> get("id"), startDate.getId(), endDate.getId());

criteriaList.add(runDatesRange);

Join<Dates, TimeInfo> timeJoin = root.join("times", JoinType.LEFT);

Predicate timeBlocksRange = criteriaBuilder.between(
        timeJoin.<Integer> get("id"), startTime.getId(), endTime.getId());

criteriaList.add(timeBlocksRange);

criteriaQuery.where(criteriaBuilder.and(criteriaList.toArray(new Predicate[0])));

TypedQuery<NetPrgTimePeriod> query = em.createQuery(criteriaQuery);

List<Dates> results = query.getResultList();

1 个答案:

答案 0 :(得分:0)

假设您确实正确地映射了您的收藏集,您似乎缺少的主要部分是Join

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Dates> query = cb.createQuery(Dates.class);

Root<Dates> root = query.from(Dates.class);
Join<Dates, DateInfo> infos = root.join("dates", JoinType.LEFT);

query.distinct(true);
em.createQuery(query.where(cb.between(infos.<Integer>get("id"), 1, 10))).getResultList();

当然你可以替换我使用字符串的元模型字段(这也会淘汰对这个丑陋的<Integer>选择器的需求 - 假设你的id 一个整数)。