Я пытаюсь извлечь все contentItems, чтобы избежать проблемы отложенной инициализации N + 1, но мой вызов setfetchmode игнорируется hibernate при использовании проекций.Не используя прогнозы, все работает как положено.
Что я делаю не так?
ContentItem - это пользовательский объект.
Session session = getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Media.class);
criteria
.setProjection(Projections.projectionList()
.add(Projections.property("id"), "id")
.add(Projections.property("fileName"), "fileName")
.add(Projections.property("mimeType"), "mimeType")
.add(Projections.property("contentItem"), "contentItem"))
.setFetchMode("contentItem", FetchMode.JOIN)
.setResultTransformer(Transformers.aliasToBean(Media.class));
criteria.addOrder(Order.asc("id"));
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResults);
return criteria.list();
ОБНОВЛЕНИЕ: в дополнение к ответу @NiVeR
Отношение сущностиТип выборки по-прежнему не влияет на результат.
private ContentItem contentItem;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "content_item_id")
public ContentItem getContentItem() {
return this.contentItem;
}
И изменение положения setFetchMode таким же образом не имеет никакого эффекта.
Session session = getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Media.class);
criteria.setFetchMode("contentItem", FetchMode.JOIN);
criteria
.setProjection(Projections.projectionList()
.add(Projections.property("id"), "id")
.add(Projections.property("fileName"), "fileName")
.add(Projections.property("mimeType"), "mimeType")
.add(Projections.property("contentItem"), "contentItem"))
.setResultTransformer(Transformers.aliasToBean(Media.class));
criteria.addOrder(Order.asc("id"));
criteria.setFirstResult(firstResult);
criteria.setMaxResults(maxResults);
return criteria.list();