【发布时间】:2014-04-15 15:39:58
【问题描述】:
我的实体有另一个实体的集合,我需要对其执行BETWEEN 标准。
我不想使用本机查询。
我正在尝试使用标准 API 来实现这一点。
以下是我的实体的简短 sn-p。
@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 子句查询DateInfo 对象中的id 的Set。
我尝试使用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();
【问题讨论】:
-
这是您的完整实体吗?因为就目前而言,您的
Set最终将成为一个 blob 列dates,而不是 FK 映射。
标签: java jpa persistence criteria