Hibernate 休眠创建重复对象

Hibernate 休眠创建重复对象,hibernate,annotations,one-to-many,Hibernate,Annotations,One To Many,Hibrate正在创建重复的对象作为我的内部联接的结果。该查询将父表与子表联接(父表与子表具有一对多关系) 数据: Category (Parent) ID|Name 1|A 2|B Testcase (Child) ID|CategoryID|Name|Run 1|1|A|500 2|1|B|500 3|1|C|500 4|2|D|600 @Entity @Table(name = "CATEGORY") public class Category implements Serializa

Hibrate正在创建重复的对象作为我的内部联接的结果。该查询将父表与子表联接(父表与子表具有一对多关系)

数据:

Category (Parent)
ID|Name
1|A
2|B

Testcase (Child)
ID|CategoryID|Name|Run
1|1|A|500
2|1|B|500
3|1|C|500
4|2|D|600
@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "CATEGORYID")
    private int ID;

    @Column(name = "CATEGORYNAME")
    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "CATEGORYID")
    @Filter(name = "TEST_RUN_ID_FILTER")
    private Collection<TestCase> testCases;
}

@Entity
@Table(name = "TESTCASE_NEW")
@FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", parameters = { @ParamDef(name = "IDS", type = "int") })
public class TestCase implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "TESTCASEID")
    private int ID;

    @Column(name = "TESTCASENAME")
    private String name;

    @Column(name = "STATUS")
    private String status;

    @Column(name = "TESTRUNID")
    private int testRunId;
}
 public List<Category> getAllCategoriesForTestRuns(List<Integer> testRunIDs)
    {
        Session session = getSession();
        session.enableFilter("TEST_RUN_ID_FILTER")
                .setParameterList("IDS", testRunIDs);
        Query query = session.createQuery("select c from Category c inner join c.testCases tc");
        List<Category> result = query.list();
        return result;
    }
运行=500的联接结果

CategoryID|TestcaseID|TestCase Name
1|1|A
1|2|B
1|3|C
由此,我希望Hibernate创建一个Category对象,其中包含3个testcase对象的列表。相反,它创建了3个Category对象,每个对象都有3个测试用例的正确列表

类别[ID=1,name=FOO,TestCase=[TestCase[ID=1,name=A,runId=500],TestCase[ID=2,name=B,runId=500],TestCase[ID=3,name=C,runId=500]]

类别[ID=1,name=FOO,TestCase=[TestCase[ID=1,name=A,runId=500],TestCase[ID=2,name=B,runId=500],TestCase[ID=3,name=C,runId=500]]

类别[ID=1,name=FOO,TestCase=[TestCase[ID=1,name=A,runId=500],TestCase[ID=2,name=B,runId=500],TestCase[ID=3,name=C,runId=500]]

型号:

Category (Parent)
ID|Name
1|A
2|B

Testcase (Child)
ID|CategoryID|Name|Run
1|1|A|500
2|1|B|500
3|1|C|500
4|2|D|600
@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "CATEGORYID")
    private int ID;

    @Column(name = "CATEGORYNAME")
    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "CATEGORYID")
    @Filter(name = "TEST_RUN_ID_FILTER")
    private Collection<TestCase> testCases;
}

@Entity
@Table(name = "TESTCASE_NEW")
@FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", parameters = { @ParamDef(name = "IDS", type = "int") })
public class TestCase implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "TESTCASEID")
    private int ID;

    @Column(name = "TESTCASENAME")
    private String name;

    @Column(name = "STATUS")
    private String status;

    @Column(name = "TESTRUNID")
    private int testRunId;
}
 public List<Category> getAllCategoriesForTestRuns(List<Integer> testRunIDs)
    {
        Session session = getSession();
        session.enableFilter("TEST_RUN_ID_FILTER")
                .setParameterList("IDS", testRunIDs);
        Query query = session.createQuery("select c from Category c inner join c.testCases tc");
        List<Category> result = query.list();
        return result;
    }
@实体
@表(name=“CATEGORY”)
公共类类别实现可序列化
{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“CATEGORYID”)
私有int-ID;
@列(name=“CATEGORYNAME”)
私有字符串名称;
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name=“CATEGORYID”)
@过滤器(name=“测试\u运行\u ID\u过滤器”)
私人收集测试用例;
}
@实体
@表(name=“TESTCASE\u NEW”)
@FilterDef(name=“TEST\u RUN\u ID\u FILTER”,defaultCondition=“TESTRUNID in(:IDS)”,参数={@ParamDef(name=“IDS”,type=“int”)})
公共类TestCase实现了可序列化
{
私有静态最终长serialVersionUID=1L;
@身份证
@列(name=“TESTCASEID”)
私有int-ID;
@列(name=“TESTCASENAME”)
私有字符串名称;
@列(name=“STATUS”)
私有字符串状态;
@列(name=“TESTRUNID”)
私有int-testRunId;
}
DAO:

Category (Parent)
ID|Name
1|A
2|B

Testcase (Child)
ID|CategoryID|Name|Run
1|1|A|500
2|1|B|500
3|1|C|500
4|2|D|600
@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "CATEGORYID")
    private int ID;

    @Column(name = "CATEGORYNAME")
    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "CATEGORYID")
    @Filter(name = "TEST_RUN_ID_FILTER")
    private Collection<TestCase> testCases;
}

@Entity
@Table(name = "TESTCASE_NEW")
@FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", parameters = { @ParamDef(name = "IDS", type = "int") })
public class TestCase implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "TESTCASEID")
    private int ID;

    @Column(name = "TESTCASENAME")
    private String name;

    @Column(name = "STATUS")
    private String status;

    @Column(name = "TESTRUNID")
    private int testRunId;
}
 public List<Category> getAllCategoriesForTestRuns(List<Integer> testRunIDs)
    {
        Session session = getSession();
        session.enableFilter("TEST_RUN_ID_FILTER")
                .setParameterList("IDS", testRunIDs);
        Query query = session.createQuery("select c from Category c inner join c.testCases tc");
        List<Category> result = query.list();
        return result;
    }
public List getallcategoriesforestruns(List testrunid)
{
Session=getSession();
session.enableFilter(“测试运行ID过滤器”)
.setParameterList(“ID”,testRunID);
Query Query=session.createQuery(“从类别c内部连接c.testCases tc中选择c”);
列表结果=query.List();
返回结果;
}
如果我更改HQL查询以选择distinct,我可以得到正确的结果,但我想知道是否有更正确的方法。通过谷歌搜索,我尝试将@Fetch(FetchMode.SELECT)添加到Category中的testCase列表中,但没有效果


谢谢

使用结果变压器:

Query query = session.createQuery("hql")
                  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

问题是,内部联接将为testCases集合中的每个实体返回一个对象(就像内部联接的DB查询结果集一样)。

非常有用,谢谢。当你把它看作一个结果集时,它是有意义的!我一直在将每个结果对象添加到一个集合中,以过滤掉总是感觉不正确的重复对象。