Можете ли вы использовать HIbernate fetch типа LAZY, но иногда используйте EAGER - PullRequest
0 голосов
/ 07 июня 2019

У меня есть класс Song , который содержит ленивую ассоциацию с CoverArt class

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name = "recNo")
private List<CoverArt> coverArts;

Это нормально, мне обычно не нужен объект CoverArt, но иногда мне нужно

  1. Для эффективности SQL
  2. Поскольку я хочу использовать класс Song в EventThread, и пользователь может попытаться получить доступ к CoverArt вне HibernateSession, поэтому он не сможет работать

Итак, как бы я изменил метод, такой как

public static List<Song> getSongsWithCoverArtFromDatabase(Session session, List<Integer> ids)
{
      Criteria c = session
              .createCriteria(Song.class)
              .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
              .add(Restrictions.in("recNo", ids));
      List<Song> songs = c.list();
      return songs;
}

чтобы он извлекал CoverArt для каждой песни

1 Ответ

1 голос
/ 07 июня 2019

Вы можете использовать setFetchMode из Criteria для установки режима выборки во время выполнения, как показано ниже,

Criteria c = session
              .createCriteria(Song.class)
              .setFetchMode("coverArts", FetchMode.EAGER)
              .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
              .add(Restrictions.in("recNo", ids));

Для получения дополнительной информации, https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FetchMode.html и https://kodejava.org/how-do-i-set-the-fetch-mode-for-criteria-association/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...