2009-10-15 2 views
0
SQLQuery query = session.createSQLQuery("select {o.id} from order o " + 
     "LEFT JOIN bookings b ON b.id = o.bookingId " + 
); 
List pusList = query.addEntity(Order.class) 
     .list(); 

и в классе порядке у меня есть:Как ограничить выборку сущностей из SQL запроса

@OneToOne(cascade = CascadeType.ALL, mappedBy = "order", fetch = FetchType.LAZY) 
private Trip trip; 

, но во время исполнения я вижу: кулак, главный SQL. и много-много запросов, таких как: Спящий режим:/* load Trip */select ......

Как я могу получить деньги за деньги?

Обновление: В этом случае поездка бесполезна. И лучше не приносить его.

+0

Какая поездка связана с вашим запросом и таблицей заказов и заказов? Есть ли какая-нибудь колонка в заказе или заказах, которые ссылаются на поездку? Какой оператор запускает выполнение всего SQL, о котором вы упоминаете (я предполагаю, что это оператор «Список pusList = ..», но это не совсем понятно. – Thorsten

+0

Извините, я подготовил плохой вопрос. Бронирование не имеет ссылки на поездку. И >> Какой оператор запускает выполнение всего SQL, о котором вы упоминаете (я предполагаю, что это оператор «Список pusList = ..», но это не совсем понятно Да, это «Список pusList = .. " И после этого я не вызываю никаких геттеров, но я вижу много SQL. – Max

ответ

0

Вы лениво получаете это означает, что основной будет загружен, а затем каждая поездка, как требуется.

В целом, см. Hibernate performance documents, чтобы узнать, что можно сделать.

Поскольку это сопоставление один к одному, я бы изменил выборки на fetch = FetchType.JOIN. Это будет загружать поездку одновременно с основным и не добавлять больше рейсов в базу данных.

+0

Да, но выборки поездок происходят сразу после вызова списка(). – Max

+0

Если вы меняете тип выборки, то они будут загружены на в то же время, что и основной. Lazy loading означает, что они выполняются в самое последнее время, которое будет при доступе к ним в вашем объекте – Mark

0

Эти способы, которые вы установили, это то, что для создания вашего объекта заказа база данных должна смотреть таблицу отключения (если я правильно прочитал ваши определения, тогда есть столбец «порядок» в поле ' trip ', которая ссылается на порядок). Вы уверены, что это действительно отношения «один к одному»? Я не знаю о вашем домене, но обычно внешние ключи сопоставляются отношениям «один ко многим», и атрибут будет представлять собой коллекцию в поездках или заказах.

Пожалуйста, добавьте дополнительную информацию о ваших таблицах/отношениях и соответствующих классах, особенно о членах, которые должны содержать отношения. Я думаю, что это дает нам дополнительную информацию, чтобы объяснить, почему происходит загрузка, и что можно сделать, чтобы избежать этого.

Смежные вопросы