Запросы к "таблицам расширений" с использованием Hibernate - PullRequest
0 голосов
/ 10 мая 2009

У меня проблема с запросами в Hibernate. У меня есть таблица 'test' с существующими данными. У меня есть требование, при котором я не могу изменить схему тестовой таблицы, поэтому я создал другую таблицу 'testExtension', первичный ключ которой является внешним ключом первичного ключа Test. Данные в testExtension - это подмножество данных в тесте. т.е. в testExtension будет меньше строк, чем в test.

Я определил это отношение в файле конфигурации следующим образом:

<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>

С помощью этой настройки я могу создать объект TestExtension в моей Java-программе, заполнить его данными, «сохранить» его через Hibernate и зафиксировать транзакцию. И он правильно сохраняет данные как в Test, так и в TestExtension.

Моя проблема возникает, когда я пытаюсь запросить данные из этих таблиц. Прямо сейчас, если я запрашиваю определенный test_id, используя TestExtension.class для QBE, он вернет строку, только если этот идентификатор существует как в Test, так и в TestExtension. Если я использую Test.class для QBE, он вернет строку, но у меня не будет доступа ни к каким данным, хранящимся в TestExtension.

Мой вопрос: как я могу запросить эти таблицы, чтобы результаты основывались на «левом внешнем соединении» как Test, так и TestExtension? Любое решение приветствуется, будь то запрос по примеру, HQL или что-то еще (хотя желательно не в виде необработанного SQL).

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 мая 2009

HQL, вероятно, самый простой способ сделать это. Документы здесь:

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

Похоже, что вы, возможно, захотите сделать, это переназначить ваши отношения так, чтобы Test и TestExtension использовали отношение один к одному вместо наследования. Затем вы можете запросить Test и TestExtension, используя левое внешнее соединение через один-к-одному.

0 голосов
/ 11 мая 2009

Если вы используете HQL для написания запроса для класса Test, он должен делать то, что вы хотите. Я предполагаю, что QBE эффективно добавляет класс вашего примера сущности в качестве одного из параметров запроса.

Так что вроде:

from Test t where t.property = :value

должен возвращать объекты Test или TestExtension. Обратите внимание, что (по крайней мере, с версиями Hibernate, которые я использовал). В этом случае Hibernate должен немедленно вернуть вам реальные сущности, а не прокси-сервер - имейте в виду, что сущности TestExtension могут иногда возвращаться как простые тестовые прокси с отложенной загрузкой.

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