新しいコードにマップしようとしている従来のコードがあります。複雑な結合のためのHibernateマッピング
OLD_PERSON
pid
sid
name
age
NEW_PERSON
pid
sid
fid
age
RESOLVE_PERSON
pid
fid
status
レガシーの世界では
domain.Person {
ID _id;
String _name;
Integer _age;
}
Javaクラスは、ただ一つのテーブルがありました:OLD_TABLE。ハイバネーションマッピングはシンプルで、1つのクラスとその列だけでした。新しい世界では、上記の3つのテーブルを使用して、名前がOLD_PERSONからNEW_PERSONになる1つのエンティティを生成する必要があります。だから、基本的にSQLクエリは次のとおりです。
select op.name as name, np.age as age
from OLD_PERSON op
INNER JOIN RESOLVE_PERSON rp
on rp.pid = op.pid
INNER JOIN NEW_PERSON np
on np.pid = rp.pid and np.fid = rp.fid and np.sid = op.sid
where rp.status = 'CURRENT'
研究の際に/私は休止XMLで「JOINテーブル」に相当している「セカンダリ表」を使用することができることを見出したグーグル。 注:このコードは古く、私はまだhibernate3.5.6ですので、注釈を使用することはできません。
は、だから、私は、マッピングファイル内の結合テーブルを追加しました:
<class name="domain.Person" table="OLD_PERSON">
<composite-id name="_id" class="Id">
<key-property access="property" name="key1" type="long" column="pid" />
<key-property access="property" name="key2" type="int" column="sid" />
<generator class="assigned" />
</composite-id>
<property name="_Name" type="String" column="name" />
<join table="NEW_PERSON" fetch="join" inverse="false">
<key>
<column name="pid" />
<column name="sid" />
</key>
<property name="_age" column="age" not-null="true" />
</join>
</class>
をしかしNEW_PERSONテーブルに内部結合がRESOLVE_PERSONテーブルと結合が必要です。私はsubselectを使ってみましたが、正しいものではありません。私はここにの式を差し込めません。
どのようにこれを達成することができるでしょうか?私が基本的に求めているのは、JOINの基準/制約チェックを適用する方法です。