2011-11-02 11 views
0

クラスにコレクションが含まれている以下のセットアップがあります。このクラスのインスタンスを照会する際、私はデータクラスではなくデータ転送クラスに値を設定するのが好きです。しかし、Hibernateは間違ったSQLクエリを生成します。私は何が欠けていますか?Hibernateのデータ転送クラスにコレクションを追加する方法

Hibernateマッピング:

<class name="Thread" table="tbl_threads" schema="dbo"> 
    <id name="Id" type="integer"> 
     <column name="i_id"/> 
     <generator class="identity"/> 
    </id> 
    <set name="keywords" inverse="true" lazy="false" cascade="all-delete-orphan" optimistic-lock="false"> 
     <key> 
      <column name="thread_id" not-null="true"/> 
     </key> 
     <one-to-many class="Comment"/> 
    </set> 
<!-- ... --> 
</class> 

<class name="ThreadKeyword" table="tbl_keywords" schema="dbo"> 
    <composite-id name="id" 
     class="se.ericsson.eab.sdk.fido.server.api.pojos.report.ReportThreadKeywordId"> 
     <key-property name="keywordId" type="integer"> 
      <column name="keyword_id" /> 
     </key-property> 
     <key-property name="threadId" type="integer"> 
      <column name="thread_id" /> 
     </key-property> 
    </composite-id> 
<!-- ... --> 
</class> 

私が使用していますHQLは

SELECT new Composite(t.id, t.keywords, ...) 
    FROM Thread t, ThreadKeyword tk 
    WHERE t.id = tk.id.threadId 

これは、SELECT部分​​はのためにのみドットが含まれているSQLを生成していますキーワード属性:

select thread1_.report_id as col_0_0_, . as col_92_0_ 
    from dbo.tbl_thread reportthre0_ inner join 
    dbo.tbl_keywords keywords4_ on reportthre0_.i_id=keywords4_.thread_id 

私が直接データクラスを照会するとき、私はスレッドテーブルにキーワードの列名を見つけることができませ休止う理解ではそれは

SELECT t 
    FROM Thread t, ThreadKeyword tk 
    WHERE t.id = tk.id.threadId 

すなわち

、正常に動作します。それはコレクションなのでそうです。むしろ後続のクエリを使用してデータを生成する必要があります。 Compositeクラスのコンストラクタでキーワードを省略すると、クエリは正しく取得されますが、HibernateはSetを設定しません。

どのようにキーワードを設定するのですか?

+0

Compositeクラスは、マッピングなしでプレーンプロパティで動作するため、Hibernateマッピングはありません。 – user1024112

答えて

0

コレクションではできません。

そうHibernateはにcol_0_0_としてthread1_.report_idこと翻訳列/値

あるt.id。それにエイリアスcol_0_0_

t.keywordsを与えたとしても休止することはとても列/値にコレクションを変換することができないだけで休止状態値のセットです。

クエリがすぐにSELECTキーワードに続く最終結果 に含まれる列のリストを含んで

- ウィキペディア

Hibernateがどのように知っているので、今

SELECT t FROM Thread t, ThreadKeyword tk WHERE t.id = tk.id.threadId 

が正常に動作しますそこにあるクエリをSQLに変換します。

+0

こんにちは、私は正しいと思いました。しかし、 'Composite'クラスを使用するために必要な制限があるので、このクラスにキーワードをフェッチする方法はありますか? – user1024112

+0

ThreadKeywordは依然としてEntityクラスであり、データ転送オブジェクトに関するステートメントと矛盾しています。エンティティをDTOにマップする場合は、Object to ObjectマッパーであるDozerを使用できます。動作するHQLとDozerを使用して、結果のオブジェクトをDTOにマップします。 – DaTroop

+0

いくつかの利点があるとしても、私はDTOを避けるでしょう。起動のために開発が遅くなります。マッパーを使用する場合は、アプリケーションの速度も遅くなります。 – DaTroop

関連する問題