我們的開發團隊存在一個大問題。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>
你可以發佈你正在嘗試的標準/ HQL查詢嗎? – Shane
你是否嘗試在列表中使用lazy = true? – Zeus
是的,我做過。它不會改變任何東西 – madtyn