2011-05-07 67 views
0

我在Hibernate類是這樣的: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的訂單,如模式中的一個。我認爲也許選擇行與nevest日期會有所幫助,但我只是無法弄清楚,如何在標準中做到這一點。所以我願意接受解決方案和幫助。謝謝

編輯: 我有要求,這是秩序。我必須用正確的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

擷取結果。Event_ & Order_是事件& 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)); 
+0

感謝您的回覆,但你可以評論你的代碼,我看到在休眠和Netbeans也是不喜歡這種代碼首次根的定義: - /我也要去編輯的問題與示例要清楚我在找什麼。 – Seth 2011-05-08 16:42:01

+0

@Seth - 看看http://docs.jboss.org/hibernate/stable/entitymanager/refere nce/en/html/querycriteria.html&你能否詳細說明「不喜歡這種類型的代碼」。 – 2011-05-08 17:29:17