У меня есть следующие настройки, где класс содержит коллекцию.При запросе экземпляров этого класса мне нравится заполнять класс передачи данных, а не класс данных.Однако Hibernate генерирует неправильный запрос SQL.Чего мне не хватает?
Отображение 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
Thisгенерирует SQL, где часть SELECT содержит только точку для атрибута ключевого слова:
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
Как я понимаюHibernate не найдет имя столбца для ключевых слов в таблице потоков.Это верно, так как это коллекция.Это скорее должно быть заполнено, используя последующие запросы.Если я опущу ключевые слова в конструкторе для класса Composite, запрос станет правильным, но Hibernate не заполнит Set.
Как получить заполненный набор ключевых слов?