- PR -

Hibernateで外部結合

1
投稿者投稿内容
ヒーロー
会議室デビュー日: 2005/03/17
投稿数: 12
投稿日時: 2005-09-28 16:12
いつもお世話になっております。
現在,Hibernateの勉強しているのですが表題の件について分からなくて困っております。

テーブルは
PERSONテーブル
+ ID (id)
+ NAME
+ BLOOD_TYPE

区分テーブル
+ CD id
+ DATA id
+ NAME

です。
BLOOD_TYPEが区分テーブルのCDが結合します。

区分テーブル
CD DATA NAME
1 1 A型
1 2 B型
というようなデータの持ち方をします。


SQLで書くと
select * from PERSONテーブル, 区分テーブル
where 区分テーブル.CD(+) = '1'
AND PERSONテーブル.BLOOD_TYPE = 区分テーブル.DATA(+)
という風に書けるのですがHibrenateではどうして書いていいのか分かりません。

普通にクエリで
from WHERE 区分テーブルクラス.CD = '1'
AND Personクラス.BLOOD_TYPE = 区分テーブル.DATA

*区分テーブルクラス、Personクラスは永続化クラスです。
上記のようにすると左結合ができません。

どなたか、分かる方がいればご教授お願いします。

Hibernate3.05を使用しています。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-09-28 22:45
このケースではHQLでの外部結合を考える必要はないですね。
Personクラスに区分テーブルへのmany-to-one関連を作るだけです。

bloodTypeプロパティを次のようにマッピングしましょう。
<many-to-one
 name="bloodType"
 class="somepackage.KubunTable"
 outer-join="true"
 foreign-key="fk_person_blood_type"
 column="blood_type"
 not-null="false" />

これでPersonクラスの参照時に外部結合を使って区分テーブルの
内容も一緒に取ってこられるようにできます(常にではないです)。

引用:
where 区分テーブル.CD(+) = '1'


この形式の外部結合はHQLでは使えないですよ。
そもそも(+)ってOracle固有な形式ですし・・・。

先ほどのマッピングを利用すると、次のようになると思います。

from Personクラス
where ( Personクラス.bloodType is null )
or ( Personクラス.bloodType.cd = '1' )

HQLでも[LEFT|RIGHT|FULL] JOINな外部結合の構文はありますが、
こちらも関連がないと使うことはできません(one-to-manyとか)。

#未検証なので間違ってたらゴメンナサイ
ヒーロー
会議室デビュー日: 2005/03/17
投稿数: 12
投稿日時: 2005-09-29 10:33
あしゅ様返信ありがとうございます。

早速試してみたのですが、

区分テーブルのマッピングを
<class name="Mtype" table="MTYPE">
<composite-id name="id" class="MtypeId">
<key-property name="cd" type="string">
<column name="CD" />
</key-property>
<key-property name="data" type="string">
<column name="DATA" />
</key-property>
</composite-id>
<property name="name" type="string">
<column name="NAME" />
</property>
</class>
にして、主キーが複合キーなので、Hibernateのドキュメントにのってた方法で、
PKを格納する永続クラスを作成してマッピングしていたところ
あしゅ様の言われた通り行うと、
Foreign key (blood:PERSON [blood_type])) must have same number of columns as the referenced primary key (MTYPE [CD,DATA])エラーが出てしまいます。

エラー内容は複合キー2つに対してマッピングしているカラムが1つしかないといわれてるみたいですがどうしたらいいでしょうか…

MTYPE(区分テーブル)のCDには固定の値を入れたいのでPERSONテーブルにはDATAに対応する項目しかもちたくありません。

説明が下手ですいませんが、誰かご教授していただけないでしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)