0

我在休眠中有这样的课程:

@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 的订单,比如模式中的一个。我认为也许选择带有 nevest 日期的行会有所帮助,但我只是想不通,如何在 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 这段代码应该可以解决问题,但它有一个很大的缺陷。它甚至会返回“已交付”的订单,因为订单中的事件是列表,其中包含订单中的每个事件。所以可能是简单的修复,比如“选择具有 event.name=Shipped 但不是 event.name=Delivered 的订单。

4

1 回答 1

0

根据事件名称模式获取结果并按日期排序。Event_ & Order_ 是 Event & Order 实体的元模型类。

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));
于 2011-05-08T13:14:40.103 回答