繁体   English   中英

JPA使用ween子句查询集合

[英]JPA query a collection using between clause

我的实体对,我需要做的另一实体的集合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等,在此未提及。 我需要使用between子句在此Set上查询DateInfo对象中的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();

假设您实际上正确地映射了集合,那么您似乎缺少的主要部分是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 整数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM