Я осуществляю контрейлерные перевозки прочь Как к объединяющим таблицам в однонаправленном 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 ссылкой на них.
Я не нашел хороший способ сделать это без двух запросов так что-то меньшее, чем это было бы большим.
Спасибо.
Я сделал пример из того, что вы опубликовали, и думаю, что это может сработать:
выберите a, b из B как b левое внешнее соединение b .parent как
в HQL.
Я должен найти «критериальный» способ сделать это.
Вы можете сделать это, указав атрибут выборки.
(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();
}
Пожалуйста, взгляните на указанную ссылку Айенде, которая объясняет это более подробно.