【问题标题】:Hibernate creating duplicate objects休眠创建重复对象
【发布时间】:2013-03-19 18:58:54
【问题描述】:

由于我的内部连接,Hiberate 正在创建重复的对象。该查询将父表与子表连接起来(父表与子表是一对多的关系)。

数据:

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

run = 500 的连接结果

CategoryID|TestcaseID|TestCase Name
1|1|A
1|2|B
1|3|C

据此,我希望 Hibernate 创建一个包含 3 个测试用例对象的列表的 Category 对象。相反,它创建了 3 个 Category 对象,每个对象都有 3 个测试用例的正确列表

类别 [ID=1, name=FOO, testCases=[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, testCases=[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, testCases=[TestCase [ID=1, name=A, runId=500], TestCase [ID=2, name=B, runId=500], TestCase [ID= 3、name=C、runId=500]]]

型号:

@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;
}

DAO:

 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;
    }

如果我将 HQL 查询更改为选择不同的,我能够得到正确的结果,但我想知道是否有更正确的方法。在我的谷歌搜索中,我尝试将 @Fetch(FetchMode.SELECT) 添加到 Category 的 testCase 列表中,但没有效果。

谢谢!

【问题讨论】:

    标签: hibernate annotations one-to-many


    【解决方案1】:

    使用 ResultTransformer:

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

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

    【讨论】:

    • 非常有帮助,谢谢。当您将其视为结果集时,它确实有意义!我一直在将每个结果对象添加到一个集合中,以过滤掉总是感觉不对的重复项。
    猜你喜欢
    • 2013-06-24
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2015-10-11
    • 2021-12-02
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多