0

クラス「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

2 に答える 2

1

A基準でまったく参照したり、エイリアスを使用したりする必要はありません。

Criteria c = session.createCriteria(B.class);
                    .add(Restrictions.eq("sex", "M"))
                    .add(Restrictions.eq("name", "XYZ"));

必要な結果が得られます。

のためInheritanceType.Joined、これはおそらくAテーブルへの結合を含む SQL を生成します (表示されている SQL に近いもの) が、基準でその結合を指定する必要はありません。

基準内の列のように見えるものは、実際には Java オブジェクト内のフィールドへの (反射的な) 参照です。Hibernate は、注釈から sql に入れる列を見つけ出し、継承注釈に基づいて必要な場合は A テーブルに結合する必要があります。

あなたのコンテキストでこれを確認し、これらすべてをよりよく理解するために、別のSO休止状態の質問に対するこの回答で説明されているように、それを試して、生成されたSQLのログを有効にすることをお勧めします。

于 2012-07-05T00:35:09.330 に答える
0

この方法を試してください: Criteria rootCrit = session.createCriteria(A.class); rootCrit.createAlias("B", "B"); rootCrit.add(Restrictions.eq("B.sex", "M")); rootCrit.add(Restrictions.eq("B.name", "XYZ"));

于 2012-07-05T11:14:19.190 に答える