我有像这样的hibernate类:
@Entity
class Order{
private MyPattern pat;
@Id
private int id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "order_id")
private List<Event> events;
public DetachedCriteria getCriteria() {
//here I create criterias
}
}
@Entity
class Event{
@Column
@Temporal(value = javax.persistence.TemporalType.DATE)
private Date date;
@Id
private int id;
@Column
private String name;
}
我需要的是从MyPattern按顺序创建DetachedCriteria(详细结构并不重要)。我已经部分实现了这个,但我现在的问题是只选择具有最新event.name的Orders,就像模式中的一样。我想也许选择具有最新日期的行会有所帮助,但我只是想弄清楚,如何在Criteria中做到这一点。所以我愿意接受解决方案和帮助。感谢
编辑: 我有要求,这是订单。我必须使用正确的Order实例进行响应(根据模式的内容)。例如:客户端仅请求已发货的订单。因此,我需要选择具有名称为“已发货”的最新事件的订单。
DetachedCriteria dc=DetachedCriteria.forClass(Order.class,"or").CreateAlias("events","eve");
dc.add(Restriction.eq("eve.name","Shipped"));
orders=dc.getExecutableCriteria(session).list();
Basicky这个代码应该可以解决这个问题,但它有一个很大的缺陷。它返回甚至是“已交付”的订单,因为订单中的事件是List,其中包含订单中的每个事件。所以也许简单的解决方法就像“选择具有event.name =已发货但不是event.name =已交付的订单。
答案 0 :(得分:0)
根据事件名称模式获取结果&amp;按日期排序。事件_&amp; Order_是Event&amp;的元模型类。订单实体。
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> order = cq.from(Order.class);
Join<Order, Event> event = cq.join(Order_.events);
cq.select(order);
cq.where(cb.like(event.get(Event_.name)), "*somePattern"); // pattern for results
cq.orderBy(cb.asc(event.get(Event_.date));