Я не могу понять HQL присоединения - PullRequest
3 голосов
/ 20 января 2010

Я начинаю работать с Hibernate. Я очень озадачен HQL объединениями ... они действительно отличаются, скажем, от присоединений mySQL ... На самом деле, если бы у меня было две таблицы, такие как Парковка и Авто, я бы сделал:

select *
from Parking
left join on Parking.pid = Auto.parkingId

или что-то подобное. Вместо этого в hibernate у меня будет класс парковки, уже связанный с Auto, и я сопоставлю все ассоциации. Таким образом, соединение будет автоматически разрешено в спящем режиме. Как бы то ни было, у меня все еще есть ключевое слово join, но в примерах оно используется непонятным мне способом, обычно указывая свойство объекта в предложении from ... что это значит? Каков SQL-эквивалент этой операции?

Ответы [ 2 ]

2 голосов
/ 21 января 2010

Важно помнить, что HQL говорит о классах и полях, тогда как SQL говорит о таблицах и столбцах.

И если вы укажете связь, hibernate автоматически выполнит присоединения за вас. Представьте себе библиотеку классов, которая содержит список книг. Каждая книга находится в одной библиотеке.

@Entity public class Library {
  @OneToMany(mappedBy"library")
  public List<Book> getBooks() {
    return books;
  }
  ...
} 

@Entity public class Book {
  @ManyToOne
  public Library getLibrary() {
    return library;
  }
  ...
}

Затем вы можете использовать hibernate, чтобы найти для вас объект библиотеки, и вам не нужно указывать какие-либо объединения. Он просто знает, что делать (хотя вы часто можете помочь ему улучшить производительность, если вы дадите ему больше подробностей).

Library library = entityManager.find(Library,1);
for (Book book : library.getBooks()) {
  System.out.println("Found book: " + book.toString());
}

По моему опыту, можно сделать многое, используя hibernate, не используя вообще "join"!

Подробнее о аннотациях на http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

2 голосов
/ 20 января 2010

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

Представьте себе случай онлайн Магазин по продаже рубашек. Каждая модель рубашки поставляется в определенном количестве доступных размеров. Требуется запрос для поиска всех моделей рубашек с размерами более 40. В HQL запрос может быть следующим:

from Shirt shirt
join shirt.availableSizes size
where size.number > 40

Другими словами, вы хотите получить все объекты, но вам нужны критерии поиска для некоторых из объединенных таблиц (и я имею в виду объединение один ко многим - у вас есть коллекция availableSizes, и вы можете ' t достичь свойства number без объединения).

редактировать
Вы можете получить больше информации от здесь . Есть некоторые объяснения по поводу явных и явных объединений. И что еще более важно - некоторые стратегии извлечения (в случае, если вы устанавливаете некоторые связи между вашими таблицами как lazy , но вы также хотите, в некоторых случаях, извлекать их немедленно). Прочтите, если нет, возможно, вы найдете это полезным.

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