2014-02-04 3 views
0

У меня есть две таблицы, в которых между этими таблицами существует соотношение «один-много». здесь является таблицей: Категория таблица (Parent таблица)hibernate duplicate domians при получении данных

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 

@Column(name="CATEGORY_NAME") 
private String categoryName; 

//bi-directional many-to-one association to TmCategoryPropertiesMapping 
@OneToMany(mappedBy="tmCategory", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private Set<TmCategoryPropertiesMapping> tmCategoryPropertiesMappings; 
............. 
....... getter and setters 

и другой объект: категория Mapping таблицы (таблица ребенка)

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 

@Column(name="CREATED_BY") 
private BigInteger createdBy; 

@Column(name="CREATED_DATE") 
private Timestamp createdDate; 

@Column(name="PROPERTY_ID") 
private BigInteger propertyId; 

//bi-directional many-to-one association to TmCategory 
@ManyToOne 
@JoinColumn(name="CATEGORY_ID") 
private TmCategory tmCategory; 

Вот если я получаю категории используя идентификатор владельца я получаю дупли в моем результате. Несмотря на то, что у меня есть только 3 записи в таблице категорий, но я получаю 10 объектов в своем результате. Может ли любое тело предложить мне, в чем причина этого. любой, как я могу исходить из этого? Данные таблицы здесь: category table data category mapping table data

В результате я получаю здесь ID = 1,1,2,2,2,3,3,3,3

ответ

1

Вы сделали toMany ассоциация EAGER. Это означает, что каждые время загрузки категории, все ее сопоставления также указаны. Это означает, что вместо того, чтобы извлекать одну строку для каждой категории, извлекаются N строк.

Чтобы дедуплицировать список результатов, вам нужно просто

select distinct 

вместо

select 

Но я бы не сделать ассоциации toMany нетерпеливы. Если вам действительно нужны категории с их отображениями в некотором случае использования, то явно за ними, вместо извлечения их каждый раз, даже когда они не нужно:

select distinct c from Category c 
left join fetch c.tmCategoryPropertiesMappings 
where ... 
+0

Извините, я не использую SQL-запрос здесь, я использую HQL. – user2823355

+0

Err, запросы в моем ответе ARE hql запросы –

+0

о, извините, я просто пропустил это – user2823355

0

Хорошо я получил его. Это происходит с отношениями с таблицами с нетерпением. Чтобы выйти из этой проблемы, мы должны указать, различны в критериях себя и вот решение:

DetachedCriteria criteria = DetachedCriteria.forClass(Category.class); 
     criteria.add(Restrictions.eq("ownerId", BigInteger.valueOf(id))); 
    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
     List<Category> categories = getHibernateTemplate().findByCriteria(criteria); 

Обратите внимание на линии

  criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

это удаляет дубликаты из набора результатов.

Смежные вопросы