Как делают я уехал, объединяющие таблицы в однонаправленном many-one в В спящем режиме?

Я осуществляю контрейлерные перевозки прочь Как к объединяющим таблицам в однонаправленном many-one условии?.

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

class A {
    @Id
    public Long id;
}

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

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

Таким образом, мой фактический вопрос, там HQL или Критерии способ создать SQL-запрос:

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

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

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

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

затем это - внутреннее объединение, и Вы не получаете записи, которые не имеют B ссылкой на них.

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

Спасибо.

8
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

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

выберите a, b из B как b левое внешнее соединение b .parent как в HQL.

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

2
ответ дан 6 December 2019 в 00:55
поделиться

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

(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();
    }

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

1
ответ дан 6 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: