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 を持つ注文のみを選択することです。ネベストの日付で行を選択すると役立つかもしれませんが、基準でこれを行う方法がわかりません。だから私は解決策と助けにオープンです。ありがとう

編集:注文があります。(パターンの内容に従って) 正しい Order インスタンスで応答する必要があります。例: すでに出荷された注文のみを要求するクライアント。そのため、「出荷済み」という名前の最新のイベントを持つ注文を選択する必要があります。

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

基本的に、このコードはうまくいくはずですが、大きな欠陥が 1 つあります。Order のイベントは、注文のすべてのイベントを含む List であるため、「配達済み」の注文も返します。したがって、「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 に答える