2015-02-26 2 views
0

Я использую hibernate для сохранения сущности в приложении, однако, когда я использую HQL для извлечения сущностей, он отлично работает и возвращает точное число сущностей, которые есть в таблице, однако, когда я использую критерии Hibernate с примером его возвращают первый объект в два раза и, таким образом, результаты по возвращению одного объекта более чем на самом деле есть в таблицеКритерии Hibernate с примером и запросом Вернуть разные результаты

Entity определение

public class ItemParentCategory { 

@Id 
@GeneratedValue 
private long id; 

private String name; 

@OneToMany(mappedBy = "itemParentCategory",fetch = FetchType.EAGER) 
@JsonIgnore 
private List<ItemSubCategory> itemSubCategorys; 

@OneToOne 
private ItemMainCategory itemMainCategory; 

@JsonIgnore 
private String summary; 



public long getId() { 
    return id; 
} 

public void setId(long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public List<ItemSubCategory> getItemSubCategorys() { 
    return itemSubCategorys; 
} 

public void setItemSubCategorys(List<ItemSubCategory> itemSubCategorys) { 
    this.itemSubCategorys = itemSubCategorys; 
} 

public ItemMainCategory getItemMainCategory() { 
    return itemMainCategory; 
} 

public void setItemMainCategory(ItemMainCategory itemMainCategory) { 
    this.itemMainCategory = itemMainCategory; 
} 

public String getSummary() { 
    return summary; 
} 

public void setSummary(String summary) { 
    this.summary = summary; 
} 

}

Код для извлечения En Tities

@Override 
public List<ItemParentCategory> getAllItemParentCategoryUnderItemMainCategory(long itemMainCategoryId) { 
    //This code works fine 
    Query query = sessionFactory.getCurrentSession().getNamedQuery("ItemParentCategory.getAllItemParentCategoryUnderItemMaincategory"); 
    query.setParameter("itemMainCategoryId", itemMainCategoryId); 
    return query.list(); 

    //This Code return undesired result 
    /*Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ItemParentCategory.class); 

    ItemParentCategory itemParentCategory = new ItemParentCategory(); 

    ItemMainCategory itemMainCategory = new ItemMainCategory(); 
    itemMainCategory.setId(itemMainCategoryId); 

    itemParentCategory.setItemMainCategory(itemMainCategory); 

    Example example = Example.create(itemParentCategory); 
    criteria.add(example); 


    return criteria.list();*/ 


} 

HQL Я использовал

FROM ItemParentCategory itemParentCategory WHERE itemParentCategory.itemMainCategory.id = :itemMainCategoryId 

ответ

1

Что здесь происходит в результате того, что вы сопоставили ItemParentCategory в ItemSubcategory как FetchType.EAGER.

Теперь это не влияет на ваш запрос HQL, поскольку запросы HQL не будут уважать сопоставление EAGER и, если вы хотите получить подкатегории в HQL, вам нужно будет явно определить FETCH JOIN в вашем запросе. Поэтому в этом сценарии все в порядке.

Если ваши изменил ваш HQL быть как ниже вы бы большинство из них имеют один и тот же вопрос дублей:

ИЗ ItemParentCategory ИЦА JOIN FETCH ipc.itemSubCategorys WHERE ipc.itemMainCategory.id =: itemMainCategoryId

Смотрите следующее два часто задаваемые вопросы:

https://developer.jboss.org/wiki/HibernateFAQ-AdvancedProblems#jive_content_id_Hibernate_does_not_return_distinct_results_for_a_query_with_outer_join_fetching_enabled_for_a_collection_even_if_I_use_the_distinct_keyword

https://developer.jboss.org/wiki/HibernateFAQ-AdvancedProblems#jive_content_id_Hibernate_ignores_my_outerjointrue_or_fetchjoin_setting_and_fetches_an_association_lazily_using_n1_selects

Запросы HQL всегда игнорируют настройку для внешнего соединения или fetch = "join" , определенные в метаданных сопоставления. Этот параметр применяется только к ассоциациям выбираются с помощью Get() или нагрузки(), критерии запросов, и график навигации

Запрос на примере затем должен работать аналогичным образом Criteria запросов и где у вас есть fetch = FetchType.EAGER Hibernate делает явное соединение. Вы должны включить ведение журнала SQL для просмотра фактического SQL, сгенерированного в каждом случае.

+0

Получил это спасибо! –

0

попробовать поставить отчетливый в запросе

query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
+1

HQL отлично работает, у меня есть проблема с выполнением выборки с критериями ее в комментарии к блоку –

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