Критерии гибернации setFetchMode игнорируется с помощью проекций - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь извлечь все 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();

1 Ответ

0 голосов
/ 07 июня 2018

Вероятно, поведение объясняется строкой:

.add(Projections.property("contentItem"), "contentItem"))

, чтобы проецировать отношение этой сущности, Hibernate использует FetchType, определенный в сущности, в которой вы определили отношение.Таким образом, FetchMode.JOIN, который вы добавляете позже, не оказывает никакого влияния, потому что это происходит позже.

...