2013-09-13 7 views
0

У меня есть 2 занятия в отношении один-ко-многим:Hibernate: где положение в LEFT JOIN не работает должным образом

Class Competition{ 
     @OneToMany(fetch=FetchType.EAGER, mappedBy="competition") 
     public Set<Event> getEvents() { 
      return events; 
     } 
    } 
    Class Event{ 
     @ManyToOne 
     @JoinColumn(name="id_competition") 
     public Competition getCompetition() { 
      return competition; 
     } 
    } 

При запуске запроса ниже я получаю больше данных, то оно должно быть. В базе данных у меня есть запись о соревнованиях, давайте назовите ее c1 и 3 события: e1, e2 и e3. Одно из событий не соответствует условию (e1 имеет stardate < '2013-09-13'), но когда я запускаю запрос, я получаю 3 события вместо 2. Я уверен в данных в базе данных, так что проблема с где статья?

"select com from Competition as com inner join com.events event where event.expectedStartdate > '2013-09-13' "

Кроме того, я должен указать, что если удалить эти 2 события, которые удовлетворяют условию и сохранить тот, который не удовлетворяет условию, то запрос ничего не возвращает (не объект конкуренции).

Я также пробовал пункт with, но получаю тот же результат.

+0

Что происходит, когда вы запускаете запрос из интерактивного пользовательского интерфейса DB? Кроме того, вы не указали, какую базу данных вы используете. –

+0

Попробуйте удалить 'fetch = FetchType.EAGER' и запустить запрос, вы говорите, что hibernate загружает все дочерние объекты. –

+0

@Jim Garrison Я использую mysql. Я отредактирую свой пост, чтобы сообщить подробности о выполнении запроса в пользовательском интерфейсе базы данных. –

ответ

2

Когда вы запрашиваете объект, вы всегда будете получать полностью реализованное отображение объекта обратно. Вы не можете отфильтровывать то, что входит в набор событий, устанавливая условия для такого запроса. Если запрос найдет Competition, вы получите весь конкурс. В конкурсе всегда будут присутствовать все его дети, когда вы попадаете в Set.

Другими словами, что ORM запрос переводится на обычный язык как:

«Найти меня каждый конкурс, который имеет по крайней мере одно событие, которое начинается после 13-го»

не

«Найти я каждый конкурс и включаю только события, если они начнутся после 13-го ».

+0

Меня интересует: « Найди мне все соревнования, в которых есть хотя бы один событие, которое начинается после 13-го и приносит мне те события, которые начинаются после 13-го ». Разве это невозможно? –

+1

Несомненно, введите тип возвращаемого запроса в события? Возвращение «частичной» сущности - это нечто вроде бессмыслицы в великой схеме вещей. Если он вернет вам Конкурс с неполным списком детей, он также будет обязан удалить те, которые вы не включили, когда сеанс синхронизируется ...... – Affe

+0

Хорошо, я подумаю о другом подходе и вернитесь с обратной связью. –

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