1

内部結合の結果、Hiberate が重複したオブジェクトを作成しています。クエリは、親テーブルを子テーブルと結合します (親は子と 1 対多の関係にあります)。

データ:

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 つのテストケース オブジェクトを含むリストを持つ 1 つの Category オブジェクトを作成することを期待します。代わりに、3 つのテストケースの正しいリストを持つ 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;
}

ダオ:

 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) をカテゴリの testCase リストに追加しようとしましたが、効果はありませんでした。

ありがとう!

4

1 に答える 1

2

ResultTransformer を使用します。

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

問題は、内部結合が testCases コレクション内の各エンティティのオブジェクトを返すことです (DB クエリの結果セットが内部結合の場合と同様)。

于 2013-03-19T19:03:00.203 に答える