Java 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就会出现,并且(不管是否懒惰)也会获取所有属性和值实例。我们想

我们的开发团队有一个大问题

我们正在使用Hibernate,我们有一些实体,它们在两个可传递的一对多关系中相互关联。主对象是一个具有属性实例列表的组,每个属性包含一个值列表

(映射在前面)

我们有两个主要问题:

A) 在进行HQL查询、Criteria查询或SQLQuery时,无论联接或WHERE子句中应用的条件如何,Hibernate都会为我们检索所有底层对象。例如,如果我制定了一个仅获取组对象的条件或SQL,那么Hibernate就会出现,并且(不管是否懒惰)也会获取所有属性和值实例。我们想控制这一切。我们希望进行左连接,只获取内部没有值的属性(Hibernate删除这些没有值的属性)

B) 例如,在进行查询时,SQL会在日志中显示所需的SQL代码。一切似乎都很完美。但在这之后,它会将列表中的每个实例都带到列表中,而不应用条件,只通过id获取它们,我们可以确保这一点,因为使用lazy=“true”可以在日志中看到“加载多对一”查询

在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?是的,我尝试过。这不会改变任何事情