2009-05-09 16 views
0

Hibernateでクエリの問題が発生しています。私は、既存のデータで 'テスト'という表を持っています。私はテストテーブルのスキーマを変更することができないという要件があるので、テストの主キーに対する外部キーである別のテーブル 'testExtension'を作成しました。 testExtensionのデータは、テスト中のデータのサブセットです。つまり、 'testExtension'には 'test'よりも少ない行があります。次のように私は設定ファイルにこの関係を定義したHibernateを使用して「拡張テーブル」を照会する

:この設定で

<class name="Test" table="test"> 
<id name="testId" column="test_id"> 
    <generator class="sequence"> 
     <param name="sequence">test_id_seq</param> 
    </generator> 
</id> 

<property name="name"/> 


<joined-subclass name="TestExtension" table="testExtension"> 
    <key column="test_id"/> 

    <property name="summary" /> 
    <property name="homepage"/> 
</joined-subclass> 

は、私は、データを移入し、私のJavaプログラムでTestExtensionオブジェクトを作成することができていますこれをHibernate経由で '保存'し、トランザクションをコミットします。また、TestExtensionとTestExtensionの両方にデータを正しく保存します。

これらのテーブルからデータをクエリしようとすると、私の問題が発生しています。 QBEにTestExtension.classを使用して特定のtest_idを照会すると、そのIDがTestとTestExtensionの両方に存在する場合にのみ行が返されます。 Test.classをQBEに使用すると、行が返されますが、TestExtensionに格納されているデータにアクセスすることはできません。

私の質問は、結果がTestとTestExtensionの両方の「左外部結合」に基づいているように、これらのテーブルをどのようにクエリできますか?サンプル、HQL、または何か他のもの(たとえは生のSQLではないことが好ましい)でも、どのような解決策も評価されます。

ありがとうございます!

+0

hibernateアノテーションを使用する可能性はありますか?私は注釈で同じことをexectlyしてしまいました。もしあなたが望むなら、私はサンプルを提出できます。 –

答えて

1

これを行うには、おそらく最も簡単な方法です。ドキュメントはここにある:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql-joins.html

は何をやりたいかもしれませんが、そのテストおよびTestExtensionが継承するのではなく、1対1の関係を使用するように、あなたの関係を再マッピングであるような音。次に、1対1で左外部結合を使用して、TestおよびTestExtensionを照会することができます。

+0

うん、これは動作します。私は、TestExtensionが 'Test' POJOの別のオブジェクトであるところで、1対1のマッピングを行うことになりました。このように関係を設定することで、QBEは予想通りの動作をします。 'Test'クラスを使用してサンプルでクエリを実行すると、 'test'テーブルのすべてのエントリに対してクエリが実行され、関連するエントリが拡張テーブルに存在する場合は、Test.TestExtensionオブジェクト。 – Todd

0

Testクラスのクエリを書くためにHQLを使用する場合は、必要な処理を行う必要があります。私は、QBEがあなたのサンプルエンティティのクラスをクエリパラメータの1つとして効果的に追加していると仮定します。

だから、のようなSTH:

from Test t where t.property = :value 

は、テストまたはTestExtensionエンティティのいずれかを返す必要があります。 (少なくとも私が使用したHibernateのバージョンでは)注意してください。この場合、Hibernateは即座にプロキシではなく実際のエンティティを返さなければなりません--- TestExtensionエンティティは、時にはテスト用のレイジーローディングプロキシとして返されることに注意してください。

関連する問題