У меня есть класс Session, который имеет отображенный коллекцию Фото объектов:Hibernate: Невозможно охотно принести коллекцию детской коллекции детской
@OneToMany(fetch = FetchType.EAGER)
@Fetch(FetchMode.SUBSELECT)
@JoinColumn(name = "sessionId", insertable = false, updatable = false)
private SortedSet<Photo> photos = new TreeSet<>();
Каждая фотография в свою очередь, имеет коллекцию Комментарий объектов, что обозначенный как FetchType.LAZY (потому что я не всегда хочу их):
@OneToMany(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
@BatchSize(size=20)
@Fetch(FetchMode.SUBSELECT)
@JoinColumn(name = "photoId", insertable = false, updatable = false)
private SortedSet<Comment> comments = new TreeSet<>();
в моем запросе для сессий, я хотел бы иметь возможность программно решить, на лету, нужно ли включать Комментарии или нет. Я пробовал (среди других вариантов):
Criteria criteria = hibSession.createCriteria(Session.class, "s")
.createAlias("photos", "p")
.setFetchMode("p.comments", FetchMode.JOIN);
Но это не так. Вызов photo.getComments() на любом из возвращенных подсайтов фотографий вызывает LazyInitializationException
.
Если я (все еще входит в область первоначальной сессии гибернации), перебираем все сеансы и внутри них все фотографии и вызываем photo.getComments().size()
, которые будут получать комментарии (в партиях, как указано).
Но есть ли способ рассказать первоначальный запрос, чтобы просто с нетерпением получить все Комментарии в первый раз, без необходимости повторять итерацию?
Спасибо.
Не уверен, если это будет работать или то, что вы хотите, но есть вы пытались использовать HQL для этого конкретного запроса? Вы можете напрямую поместить соединение в запрос. – Asoub
Какую версию Hibernate вы используете? –
Извините - следовало бы упомянуть. Это 4.3.6. – rweiser