2013-05-06 75 views
3

我有以下數據模型:與訂單具有OneToMany關係的客戶。JPQL /標準API訂單MAX OneToMany協會

@Entity 
public class Customer{ 
    ... 

    private Long id; 

    @OneToMany 
    private Collection<Order> orders; 

    ... 
} 


@Entity 
public class Order{ 
    ... 
    private Long id; 

    private Date orderDate; 

    @ManyToOne 
    private Customer customer; 

    ... 
} 

我想根據最新orderDate列出排名前10的客戶。因此,在最近的日期下訂單的客戶應該出現在列表頂部,等等。

是否可以使用單個JPQL或Criteria API執行此操作?

+0

只需提一下:我最終使用JPA的本機SQL方法來解決此問題。不知道這是否是最好的方法,但考慮到這種情況絕對是可行的。 – Lal 2013-05-08 22:44:32

回答

0

在HQL:

Query query = session.createQuery("select Customer c JOIN c.orders order ORDER BY order.orderDate DESC") 
query.setMaxResults(10); 

而關於你寫的一些建議和您的代碼:

  • 避免EAGER。 JPA中的每個* ToOne關係都會執行EAGER提取。如果可能的話,將fetchType改爲LAZY。
  • 僅在最後一種情況下的原生查詢。在特定情況下,它們非常有用。但是,要做一個簡單的查詢,如果你想一次處理多個數據庫(集成測試的常見場景),你將會受到限制。例如,爲了使這個簡單的查詢限制信息量,每個數據庫使用不同的方法來完成這個(limit,rownum,top等)。使用HQL/Criteria,你不必擔心這一點。