- PR -

Hibernate 結合マッピングが存在しないクラス同士のJoin方法

投稿者投稿内容
yellowfd3s
会議室デビュー日: 2005/02/16
投稿数: 15
投稿日時: 2005-03-02 13:38
おかもと様、abby様、ありがとうございます。

下記コーディングでJOINできています。
HibernateTemplate template = getHibernateTemplate();
final String sql = "from A a, B b where a.id = b.id(+) order by a.id";
try {
  return (List)template.execute(
    new HibernateCallback() {
      public Object doInHibernate(Session session)
          throws HibernateException {
        Query query = session.createQuery(sql);
        return query.list();
      }
    }
  );
} catch (DataAccessException e) {
  throw new DAOException("Couldn't find all A.", e);
}

final String sql = "from A a, B b where a.id = b.id(+) order by a.id";
このHQLを"from A a left outer join B b where a.id = b.id order by a.id"とするとエラーとなりました。
正常にJOINできているHQLでORACLE以外のDBでも大丈夫なのかなと思ったので質問をさせて頂きました。
山本@クロノス
会議室デビュー日: 2005/05/12
投稿数: 1
お住まい・勤務地: 大阪
投稿日時: 2005-05-12 09:10
連載を執筆させていただいた山本@クロノスです。

状況を拝見させていただき、
「連載:Hibernateで理解するO/Rマッピング(5)のPage2」
について、詳しく検証してみましたところ
掲載内容に間違いがあったことが確認されました。

大変ご迷惑をおかけしましたことをお詫びし、
以下に訂正させていただきたく思います。

【間違い】
1、そもそもHQLにright outer join は存在しておりません。
left outer joinの間違いです。

2、マッピングファイルに結合条件を記述せずに結合を行う場合、
 outer join句を使用することはできません。

【結論】
結論といたしましてはマッピングファイルで結合指定せずに
HQLで外部結合を表現する標準的な方法は無いということになります。

Oracleの結合条件句で(+)を使用した方法であれば可能だったのですが、
これはHibernateを適切に使用する方法ではなく、
記事に掲載するには不適切な内容といわざるを得ません。

@ITの編集担当には、訂正依頼を申し出ております。

執筆時にあたって、サンプルプログラムは動作確認を十分に行って
掲載していたつもりでしたが、非常に根本的なミスで
皆様を混乱させてしまいました。
大変ご迷惑をおかけしました。
ここにお詫びいたします。
yellowfd3s
会議室デビュー日: 2005/02/16
投稿数: 15
投稿日時: 2005-05-16 17:13
山本@クロノスさん。
記事の内容を検証していただきありがとうございました。
又、詳しく解説していただきありがとうございます。
今後の参考にいたします。
ftakano
会議室デビュー日: 2003/04/01
投稿数: 12
投稿日時: 2005-06-10 10:01
Hibernate3に限るのかもしれませんが、many-to-one の属性に not-found というのがあって、ドキュメントを見る限り制約がない場合の外部結合ができそうです。
(申し訳ありません、ためしておりません。。)

以下ドキュメントからの抜粋
------------
(13) not-found (optional - defaults to exception): Specifies how foreign keys that reference missing rows will be handled: ignore will treat a missing row as a null association.

------------
ご参考まで。

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