У меня есть класс Song , содержащий коллекцию CoverArt s
1007 * например *
@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name = "recNo")
private List<CoverArt> coverArts;
и я использую Hibernate 4.3.11 и базу данных DB2, и у меня есть этот запрос для получения списка песен по их первичному ключу вместе с их coverArt.
public static List<Song> getSongsWithCoverArtFromDatabase(Session session, List<Integer> ids)
{
try
{
Criteria c = session
.createCriteria(Song.class)
.setFetchMode("coverArts", FetchMode.JOIN)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.add(Restrictions.in("recNo", ids));
List<Song> songs = c.list();
return songs;
}
catch (Exception e)
{
MainWindow.logger.log(Level.SEVERE, "Failed LoadSongToDatabase:" + e.getMessage(), e);
throw new RuntimeException(e);
}
}
Обратите внимание, что мы установили режим выборки на JOIN в коллекции coverArts и что нам нужно установить s etResultTransformer (Criteria.DISTINCT_ROOT_ENTITY) , в противном случае, если у нас была песня с двумя общими записями, мы вернули бы два объекта Song обратно. Но при использовании Criteria.DISTINCT_ROOT_ENTITY Hibernate правильно вернул бы одну композицию, содержащую два coverArts.
Однако я только что попытался сделать то же самое, но с использованием StatelessSession. Причина в том, что я просто пытаюсь выбрать данные для создания отчета, и я хочу максимизировать скорость и минимизировать потребление памяти, однако
public static List<Song> getSongsWithCoverArtFromDatabase(StatelessSession session, List<Integer> ids)
{
try
{
Criteria c = session
.createCriteria(Song.class)
.setFetchMode("coverArts", FetchMode.JOIN)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.add(Restrictions.in("recNo", ids));
List<Song> songs = c.list();
return songs;
}
catch (Exception e)
{
MainWindow.logger.log(Level.SEVERE, "Failed LoadSongToDatabase:" + e.getMessage(), e);
throw new RuntimeException(e);
}
}
это, кажется, игнорирует .setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY) и возвращает дублирующиеся строки.
Это известная ошибка, как она должна себя вести?