2014-02-24 28 views
0

我們的開發團隊存在一個大問題。Hibernate在不詢問的情況下多對一地檢索

我們使用Hibernate,並且我們有一些實體在兩個傳遞的一對多關係中相關。主要對象是一個具有Property實例列表的Group,每個Property都包含一個Values列表。

(的映射下降進取)

我們有兩個主要問題:

A)當進行HQL查詢,條件查詢或的SQLQuery不要緊應用的條件下加入或WHERE子句,Hibernate總是爲我們檢索所有的基礎對象。例如,如果我讓Criteria或SQL只獲取Group對象,Hibernate會自動獲取所有的Property和Value實例。我們想要控制這一點。我們想要做左邊的連接,並且只獲得裏面沒有數值的屬性(Hibernate刪除這些沒有數值的屬性)

B)當進行查詢時,例如SQL,它會在日誌中顯示我們的SQL代碼想。一切似乎完美。但在此之後,它會將列表中的每個實例都應用到條件中,但只能通過id獲取它們,我們可以保證這一點,因爲使用lazy =「true」時,我們會在日誌中看到「加載多對一」查詢。

有什麼我們可以做的休眠配置,獲取模式/策略,映射配置或任何地方?我正在考慮繼續使用Result變形金剛。

如果有人給我提示或告訴我在哪裏可以找到解決方案,我將不勝感激。我們對如何獲得這一點感到困惑,但它必須是一種方式。

在此先感謝

查詢:

Criteria lstCriterios = this.getSession().createCriteria(CardGroup.class, CARD_GROUP) 
      .add(Restrictions.eq(ID_CATEGORY, idCategory)); 

    lstCriterios.createAlias("listProperty", "listProperty", CriteriaSpecification.LEFT_JOIN); 

    if (clusterId != null) { 
     lstCriterios.add(Restrictions.or(
       Restrictions.isNull("listPropertyValue" + ".value"), 
       Restrictions.and(Restrictions.eq("listPropertyValue" + ".clusterId", clusterId), 
         Restrictions.eq("listPropertValue" + ".companyWarehouseId", idCompanyWarehouse)))); 
     lstCriterios 
       .createAlias("listProperty" + "." + "listPropertyValue", "listPropertyValue", 
         CriteriaSpecification.LEFT_JOIN, 
         Restrictions.eq("listPropertyValue" + ".clusterId", clusterId)); 
    } else { 
     lstCriterios.createAlias("listProperty" + ".listPropertyValue", "listPropertyValue", 
       CriteriaSpecification.LEFT_JOIN); 
    } 

    lstCriterios.add(Restrictions.eq(ID_CATEGORY, idCategory)); 
    lstCriterios.add(Restrictions.eq("listProperty" + ".groupId", idGroup)); 
    lstCriterios.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
    /* 
    * Sorting 
    */ 
    lstCriterios.addOrder(Order.asc("order")); 
    lstCriterios.addOrder(Order.asc("listProperty" + ".order")); 


    lstCriterios.addOrder(Order.asc("listPropertyValue"+ ".clusterId")); // Agrupacion, podría ser nulo 
    lstCriterios.addOrder(Order.asc("listPropertyValue"+ ".propertyId")); // Propiedad 
    lstCriterios.addOrder(Order.asc("listPropertyValue"+ ".id")); 

    return lstCriterios.list(); 

組映射:

<list name="listProperty" 
     table="FICHA_PROPIEDAD" schema="${db2.siglo.schema}" 
     inverse="false" cascade="all" > 

     <key column="ID_FICHA_GRUPO" not-null="false" /> 
     <list-index column="ORDEN" base="1"/> 

     <one-to-many 
      class="com.company.aslo.appwebsiglo.model.card.property.property.CardProperty" /> 
</list> 

屬性映射:

<bag name="listPropertyValue" 
     table="FICHA_PROPIEDAD_VALOR" schema="${db2.siglo.schema}" 
     inverse="false" cascade="all"> 

     <key column="ID_FICHA_PROPIEDAD" not-null="false" /> 
     <one-to-many 
      class="com.company.aslo.appwebsiglo.model.card.propertyvalue.propertyvalue.CardPropertyValue" /> 
</bag> 
+1

你可以發佈你正在嘗試的標準/ HQL查詢嗎? – Shane

+0

你是否嘗試在列表中使用lazy = true? – Zeus

+0

是的,我做過。它不會改變任何東西 – madtyn

回答

0

好像我們的模型設計是壞,我們沒有意識到如果數據庫表FICHA_PROPIEDAD_VALOR具有複合關鍵字,我們不能僅映射覆合關鍵字中的一個屬性,因爲它帶給我們意想不到的結果。因爲這個和嵌套的對象,我們也有Hibernate使用的hashCode()和equals()方法的錯誤實現。

我以前用ResultTransformer從SQLQuery中獲取行解決了這個問題,但是在重構和改變模型設計之後,我們得到了Hibernate解決方案。

相關問題