Suppose that I have the following entity:
@Entity
@Table(name="ORDER_ITEM")
public class Order {
@Id
@Column(name = "ORDER_ID")
private Long id;
@Column(name = "ORDER_VALUE")
private BigDecimal value;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(style = "M-")
@Column(name = "CREATED_AT", columnDefinition = "date")
private Date createdAt;
@Column(name = "HOURS_MAX")
private Integer hoursMax = 24;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Integer getHoursMax() {
return hoursMax;
}
public void setHoursMax(Integer hoursMax) {
this.hoursMax = hoursMax;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", value=" + value +
", createdAt=" + createdAt +
", hoursMax=" + hoursMax +
'}';
}
}
So i need make a criteria query of orders limiting by createAt date field in a period maximun of hoursMax integer field. I see a lot of examples using a Date instance java minus a integer literal value in hours like example below:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> orderRoot = cq.from(Order.class);
Calendar c = Calendar.getInstance();
c.add(Calendar.HOUR_OF_DAY, -24);
cq.select(orderRoot).where(
cb.greaterThan(orderRoot.get(Order_.createdAt) ,c.getTime())
);
TypedQuery<Order> query = em.createQuery(cq);
List<Order> result = query.getResultList();
But, in this case i need use the field hoursMax that represents this maximun period what i should put into ???? below ?
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> orderRoot = cq.from(Order.class);
cq.select(orderRoot).where(
cb.greaterThan(orderRoot.get(Order_.createdAt) , ??? )
);
TypedQuery<Order> query = em.createQuery(cq);
List<Order> result = query.getResultList();
Note: Also, I want to avoid executing a additional pre query for hoursMax.