Как добавить коллекции в класс передачи данных в Hibernate - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть следующие настройки, где класс содержит коллекцию.При запросе экземпляров этого класса мне нравится заполнять класс передачи данных, а не класс данных.Однако 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.

Как получить заполненный набор ключевых слов?

1 Ответ

0 голосов
/ 02 ноября 2011

Вы не можете сделать это с коллекцией.

t.id - это столбец / значение

, поэтому Hibernate переводит это в thread1_.report_id как col_0_0_.Hibernate даже дал ему псевдоним col_0_0_

t.keywords - это набор значений, поэтому Hibernate просто не может перевести коллекцию в столбец / значение.

Запрос включает в себя список столбцов, которые должны быть включены в окончательный результат сразу после ключевого слова SELECT - Википедия

Теперь

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

работает нормальнопотому что Hibernate знает, как перевести ваш запрос в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...