Как оставить таблицы соединений в однонаправленном режиме «многие к одному» в Hibernate?

Я использую Как присоединиться к таблицам в однонаправленном режиме «многие к одному»?.

Если у вас есть два класса:

class A {
    @Id
    public Long id;
}

class B {
    @Id
    public Long id;
    @ManyToOne
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    public A parent;
}

B -> A - отношение многие к одному. Я понимаю, что могу добавить Коллекцию B к A, однако мне не нужна эта ассоциация.

Итак, мой фактический вопрос: существует ли способ HQL или Criteria для создания SQL-запроса:

select * from A left join B on (b.parent_id = a.id)

Это позволит получить все записи A с декартовым произведением каждой записи B, которая ссылается на A, и будет включать записи A, на которые не ссылается B.

Если вы используете:

from A a, B b where b.a = a

тогда это внутреннее соединение, и вы не получаете записи A, на которые не ссылается B.

Я не нашел хорошего способа сделать это без двух запросов, поэтому все, что меньше этого, было бы здорово.

Спасибо.


person jbarz    schedule 04.03.2010    source источник
comment
@Joe B А что ты хочешь, это... ???   -  person Arthur Ronald    schedule 05.03.2010
comment
@Arthur Ronald FD Garcia: мне нужен способ Criteria или HQL для создания необработанного SQL-запроса, который я написал выше. Я отредактировал пост, чтобы выделить актуальный вопрос жирным шрифтом.   -  person jbarz    schedule 05.03.2010


Ответы (2)


Я сделал пример с тем, что вы опубликовали, и я думаю, что это может сработать:

select a,b from B as b left outer join b.parent as a в HQL.

Я должен найти "критериальный" способ сделать это.

person Luciano    schedule 05.03.2010
comment
Может быть, ЭТО поможет: выберите a, b из B как b правое соединение b.parent как a - person Luciano; 05.03.2010
comment
Я не думал о правильном соединении. Пока HQL поддерживает правильные соединения, и я использую только несколько таблиц, которые могут работать. Я попробую. - person jbarz; 06.03.2010

Вы можете сделать это, указав атрибут fetch.

(10) выборка (необязательно) Выбор между выборкой внешнего соединения и последовательной выборкой.

Вы можете найти его по адресу: Глава 6. Отображение коллекций прокрутите вниз до: 6.2. Сопоставление коллекции

ИЗМЕНИТЬ

Я прочитал в комментарии к вашему вопросу, что вам нужен способ выполнить необработанный SQL-запрос? Вот ссылка, которая может быть интересна:

Глава 13. Собственные SQL-запросы

и если вы хотите сделать это возможным через HQL:

Глава 11. HQL: язык запросов Hibernate

В главе 11 вы хотите прокрутить вниз до 11.3. Ассоциации и соединения.

IQuery q = session.CreateQuery(@"from A as ClassA left join B as ClassB");

Однако я предполагаю, что ClassB должен быть членом ClassA. Дальнейшие чтения должны помочь.

Еще одна вещь, которая может оказаться полезной для вас, это именованные запросы:

<query name="PeopleByName">
from Person p
where p.Name like :name
</query>

И вызывая этот запрос из кода так:

using (var session = sessionFactory.OpenSession())
    using (var tx = session.BeginTransaction()) {
        session.GetNamedQuery("PeopleByName")
            .SetParameter("name", "ayende")
            .List();
        tx.Commit();
    }

Пожалуйста, взгляните на ссылку, на которую ссылается Айенде, которая объясняет это более подробно.

person Will Marcouiller    schedule 05.03.2010
comment
Я не хочу отображать коллекцию B в A. Мне нужен запрос без сопоставленной коллекции. - person jbarz; 05.03.2010