2010-12-07 18 views
3

好了,以下查詢:Hibernate Criteria - 如何將連接結果限制爲單個實體類型?

SELECT O.*, P.* FROM ORDERS O, PRODUCT P WHERE 
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’; 

可以與標準來進行,如下所示:

List ordersAndProducts = session.createCriteria(Order.class) 
    .setFetchMode(「products」,FetchMode.JOIN) 
    .add(Restrictions.eq(「id」,」1234」)) 
    .list(); 

但這裏Criteria.list()返回List<Object[]>其中Object[0]OrderObject[1]是每個元件的Product在列表中。

但我可怎麼辦下面的SQL與標準:

SELECT O.* FROM ORDERS O, PRODUCT P WHERE 
    O.ORDER_ID=P.ORDER_ID AND P.ID=’1234’; 

換句話說,我想Criteria.list()給我一個List<Order>,我不關心Products。我已經嘗試使用createAlias()而不是setFetchMode(),但結果相同,並且預測不會讓您指定實體,而僅指定屬性。

回答

6

您可以在條件上使用.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)

List ordersAndProducts = session.createCriteria(Order.class) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .setFetchMode(「products」,FetchMode.JOIN) 
    .add(Restrictions.eq(「id」,」1234」)) 
    .list(); 

現在,您檢索所有訂單與熱切負載的產品。

+0

謝謝!我懷疑使用ResultTransformer會是一種方式,但相當不透明的文檔並不能幫助您知道使用哪一個。 – mluisbrown 2010-12-07 15:33:37

+0

不錯的答案(geht doch ... :-)) – 2010-12-08 14:08:47

2

Criteria類中使用createCriteria方法獲取關係。

List ordersAndProducts = session.createCriteria(Order.class) 
    .createCriteria(「products」) 
     .add(Restrictions.eq(「id」,」1234」)) 
    .list(); 

您可以閱讀(稍有混淆)關於它的文檔here

相關問題