Критерии гибернации, выберите порядок в соответствии с новейшими событиями - PullRequest
0 голосов
/ 08 мая 2011

У меня есть классы в спящем режиме, например:

@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;
}

Мне нужно создать DetachedCriteria в порядке от MyPattern (структура деталей не важна).Я частично это реализовал, но теперь моя проблема состоит в том, чтобы выбрать только те Ордера, которые имеют самое новое событие.имя, как в шаблоне.Я думаю, что выбор строки с ближайшей датой поможет, но я просто не могу понять, как это сделать в критериях.Так что я открыт для решений и помощи.Спасибо

редактировать: у меня есть запрос, который заказ.Я должен ответить с правильным экземпляром заказа (в соответствии с содержанием шаблона).Например: клиент запрашивает только те заказы, которые уже были отправлены.Поэтому мне нужно выбрать «Ордера» с самым последним событием с именем «Shipped».

DetachedCriteria dc=DetachedCriteria.forClass(Order.class,"or").CreateAlias("events","eve");
dc.add(Restriction.eq("eve.name","Shipped"));
orders=dc.getExecutableCriteria(session).list();

Basicky, этот код должен сработать, но у него есть один БОЛЬШОЙ недостаток.Он возвращает даже заказы, которые были «доставлены», потому что события в Order is List, который содержит каждое событие в заказе.Так что, может быть, просто исправить, как «выбрать заказы, у которых есть event.name = Отправлено, но НЕ event.name = Доставлено.

1 Ответ

0 голосов
/ 08 мая 2011

Выборка результатов на основе шаблона имени события и упорядочены по дате.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));
...