Java Hibernate无需询问即可检索多对一
我们的开发团队有一个大问题 我们正在使用Hibernate,我们有一些实体,它们在两个可传递的一对多关系中相互关联。主对象是一个具有属性实例列表的组,每个属性包含一个值列表 (映射在前面) 我们有两个主要问题: A) 在进行HQL查询、Criteria查询或SQLQuery时,无论联接或WHERE子句中应用的条件如何,Hibernate都会为我们检索所有底层对象。例如,如果我制定了一个仅获取组对象的条件或SQL,那么Hibernate就会出现,并且(不管是否懒惰)也会获取所有属性和值实例。我们想控制这一切。我们希望进行左连接,只获取内部没有值的属性(Hibernate删除这些没有值的属性) B) 例如,在进行查询时,SQL会在日志中显示所需的SQL代码。一切似乎都很完美。但在这之后,它会将列表中的每个实例都带到列表中,而不应用条件,只通过id获取它们,我们可以确保这一点,因为使用lazy=“true”可以在日志中看到“加载多对一”查询 在hibernate配置、获取模式/策略、映射配置或任何地方,我们都可以做些什么?我现在正在考虑进行结果变换 如果有人能给我一个提示或告诉我在哪里找到解决这个问题的办法,我将不胜感激。我们对如何获得这一点感到困惑,但这一定是一种方法 提前谢谢 查询:Java Hibernate无需询问即可检索多对一,java,sql,hibernate,one-to-many,hibernate-mapping,Java,Sql,Hibernate,One To Many,Hibernate Mapping,我们的开发团队有一个大问题 我们正在使用Hibernate,我们有一些实体,它们在两个可传递的一对多关系中相互关联。主对象是一个具有属性实例列表的组,每个属性包含一个值列表 (映射在前面) 我们有两个主要问题: A) 在进行HQL查询、Criteria查询或SQLQuery时,无论联接或WHERE子句中应用的条件如何,Hibernate都会为我们检索所有底层对象。例如,如果我制定了一个仅获取组对象的条件或SQL,那么Hibernate就会出现,并且(不管是否懒惰)也会获取所有属性和值实例。我们想
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>
看起来我们的模型设计很糟糕,我们没有意识到如果DB表FICHA_PROPIEDAD_VALOR有复合键,我们就不能只映射复合键中的一个属性,因为它会给我们带来意想不到的结果 由于这一点和嵌套对象,Hibernate使用的hashCode()和equals()方法的实现也很糟糕
我以前用ResultTransformer从SQLQuery中获取行来解决这个问题,但在重构和更改模型设计之后,我们得到了Hibernate解决方案。您可以发布您正在尝试的条件/HQL查询吗?您是否尝试在列表中使用lazy=true?是的,我尝试过。这不会改变任何事情