クラスにコレクションが含まれている以下のセットアップがあります。このクラスのインスタンスを照会する際、私はデータクラスではなくデータ転送クラスに値を設定するのが好きです。しかし、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を設定しません。どのようにキーワードを設定するのですか?
Compositeクラスは、マッピングなしでプレーンプロパティで動作するため、Hibernateマッピングはありません。 – user1024112