我的实体拥有另一个实体的集合,我需要在该实体上执行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();
答案 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 是一个整数)。