Hibernate Criteria,根据最新事件选择订单

时间:2011-05-07 20:19:57

标签: java hibernate criteria detachedcriteria

我有像这样的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 =已交付的订单。

1 个答案:

答案 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));