2

クラス「X」がテーブル「X」にマッピングされ、クラス「A」がテーブル「A」にマッピングされ、クラス「B」がテーブル「B」にマッピングされているとします。

テーブル X 構造:(X_ID、他のいくつかの列 テーブル A 構造:(A_Id、X_Id、他のいくつかの列) テーブル B 構造:(A_Id、他のいくつかの列)...テーブル B にも A_Id があります

クラス 'B' はクラス 'A' を拡張します。両方のマッピング ファイルは次のとおりです。

クラス 'A' 親マッピング ファイル:

@Entity
@Table(name = 'A')
@Inheritance(stratergy=InheritanceType.Joined)
public abstract class A {
@Id @Clumns(name = "A_Id)
@GeneratedValue
protected Long aId;
-- some more A specific fields
}

クラス 'B' マッピング ファイル:

@Entity
@Table(name= 'B')
Public class B extends A{
---- B specific fields
}

今、私は休止状態の基準 API を使用して記述する必要がある以下のような SQL クエリを持っています。

select * from X
INNER JOIN A 
ON X.id = A.id
INNER JOIN B
ON A.id = B.id
where B.name = 'XYZ'
   and B.Sex = 'M'

私は思いついた:

Criteria c = session.createCriteria(x.class, "x");
                    .createAlias("x.a", "a")
                    .createAlias("a.b", "b")          
                    .add(Restrictions.eq("b.sex", "M"))
                    .add(Restrictions.eq("b.name", "XYZ"));

しかし、マッピング ファイルを確認すると、A に B の直接参照はありません。したがって、休止状態は「B は A に関連していません」エンティティをスローします。

この継承をクエリ基準にマップする方法はありますか

4

1 に答える 1

1

B は A です。したがって、A と B を結合する必要はありません。Hibernate がそれを行います。

Criteria c = session.createCriteria(x.class, "x");
                    .createAlias("x.a", "b")
                    .add(Restrictions.eq("b.sex", "M"))
                    .add(Restrictions.eq("b.name", "XYZ"));
于 2012-07-05T14:01:24.567 に答える