2017-02-01 6 views
3
Информация

Таблица:Fetch возвращает только один элемент в коллекции

Image таблица содержит внешний ключ MediaID своей родительской таблицы средств массовой информации

---------- 
id | mediaid | url 
======================== 
104 | 103  | IMG_PATH 
383 | 103  | IMG_PATH 
384 | 103  | IMG_PATH 
395 | 103  | img_path 

Медиа лицо имеет коллекция изображений:

private Set<Image> images = new HashSet<Image>(0)`; 

@OneToMany(mappedBy = "media", targetEntity = Image.class ,cascade = CascadeType.ALL) 
public Set<Image> getImages() { 
    return images; 
} 

Изображение объект сниппет:

private Media media; 
@ManyToOne 
@JoinColumn(name = "mediaId") 
public Media getMedia() { 
    return media; 
} 

Я реализовал следующий запрос, который должен возвращать объект медиа с коллекцией всех изображений, чьи Ф.К. соответствует его идентификатор при условии.

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Media> cqObject = cb.createQuery(Media.class); 
Root<Media> rootEntry = cqObject.from(Media.class); 

rootEntry.fetch(Media_.images, JoinType.LEFT);    
Predicate predicate = cb.equal(rootEntry.get(Media_.id), id);   
cqObject.select(rootEntry).where(predicate);   
Media _fetcheMedia = em.createQuery(cqObject).getSingleResult(); 

Коллекция для объекта Media, которая была возвращена, содержит только один элемент изображения. Я точно знаю, что база данных содержит несколько элементов изображения для указанного носителя.

* Примечание Media_ просто класс метамодели, который представляет собой медиа-объект

Hibernate за объект медиа с идентификатором = 103

select media0_.mediaId as mediaId1_8_0_, 
    images1_.imageId as imageId1_6_1_, 
    media0_.active as active2_8_0_, 
    media0_.created as created3_8_0_, 
    media0_.description as descript4_8_0_, 
    media0_.listType as listType5_8_0_, 
    media0_.parentId as parentId6_8_0_, 
    media0_.propertyTypeId as property7_8_0_, 
    media0_.seasonId as seasonId8_8_0_, 
    media0_.status as status9_8_0_, 
    media0_.userId as userId10_8_0_, 
    images1_.active as active2_6_1_, 
    images1_.created as created3_6_1_, 
    images1_.imageTypeId as imageTyp5_6_1_, 
    images1_.imageUrl as imageUrl4_6_1_, 
    images1_.mediaId as mediaId6_6_1_, 
    images1_.mediaId as mediaId6_6_0__, 
    images1_.imageId as imageId1_6_0__ from media media0_ 
    left outer join image images1_ on media0_.mediaId=images1_.mediaId where media0_.mediaId=103 
+0

Хорошо, когда вы получаете объект Media, есть ли изображения, загруженные сущностью или прокси-сервером, которые вам нужно ленить инициализировать? –

+0

Я предполагаю, что он по умолчанию является ленивым init, а rootEntry.fetch (Media_.images, JoinType.LEFT) заставляет выборку в коллекции. – Fabii

+0

критерии выглядят хорошо .. можете ли вы запустить в режиме отладки и опубликовать запрос, который сгенерирован? –

ответ

0

Это была глупая ошибка с моей стороны, я забыл для переопределения метода hashcode и equals для объекта Image. Добавил их, и он знает, как работает.

@Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = super.hashCode(); 
     result = prime * result + (int) (id^(id >>> 32)); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (!super.equals(obj)) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Image other = (Image) obj; 
     if (id != other.id) 
      return false; 
     return true; 
    }