Hibernate Criteria提取重复项 - 一对多关联

时间:2012-04-04 18:30:14

标签: hibernate hibernate-mapping

组件 - >

      --> feature 1 

      --> feature 2

      --> feature 3

组件与功能

具有一对多的关系

即使功能表中有3个不同的记录,hibernate Criteria也只提取最后一条记录并显示3次。

我提供了我的hbm文件以及标准代码。

从组件表中查询很好但问题仅在于功能表

component.hbm.xml

<class name="com.arv.RelationMapping.component" table="component" >

    <id name="componentPK" column="component_pk" type="java.lang.Long"/>
    <property name="componentName" column="component_name" type="java.lang.String"/>

    <set name="feature" table="feature" inverse="true">     
        <key>
            <column name="component_pk"/>
        </key>      
        <one-to-many class="com.arv.RelationMapping.feature" />     
    </set>

</class>

features.hbm.xml

<class name="com.arv.RelationMapping.feature" table="feature">

    <id name="featurePK" column="feature_pk" type="java.lang.Long"/>

    <many-to-one name="component" class="com.arv.RelationMapping.component" fetch="select">
        <column name="component_pk"/>   
    </many-to-one>

    <property name='scenarioId' column="scenario_id" type="java.lang.String"/>
    <property name='scenarioDesc' column="scenario_desc" type="java.lang.String"/>
    <property name='testCaseFile' column="test_case_file" type="java.lang.String"/>

</class>

Java类

公共课测试{

public static void main(String[] args) 
{
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();

    Criteria criteria = session.createCriteria(feature.class);
    List summaryList = criteria.list();
    feature feature = new feature();

    System.out.println(summaryList.size()); // getting size correctly

    if(summaryList !=null)
    {
        for(Object obj:summaryList)
        {
            feature = (feature)obj;

                    // getting same values for each loop
            System.out.println(feature.getScenarioDesc());
            System.out.println(feature.getScenarioId());
            System.out.println(feature.getFeaturePK());

        }
    }
    session.close();    
}

}

2 个答案:

答案 0 :(得分:2)

使用criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);可能会有所帮助。

答案 1 :(得分:0)

public static void main(String[] args) 
{
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();

    Criteria criteria = session.createCriteria(feature.class);
    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    List summaryList = criteria.list();
    feature feature = new feature();

    System.out.println(summaryList.size()); // getting size correctly

    if(summaryList !=null)
    {
        for(Object obj:summaryList)
        {
            feature = (feature)obj;

                    // getting same values for each loop
            System.out.println(feature.getScenarioDesc());
            System.out.println(feature.getScenarioId());
            System.out.println(feature.getFeaturePK());

        }
    }
    session.close();    
}