java - Hibernate 的 Criteria With Examples 和 Query 返回不同的结果

标签 java spring hibernate entity

我正在使用 hibernate 来实现应用程序中的实体持久性,但是当我使用 HQL 来获取实体时,它工作正常并返回表中实体的确切数量,但是当我在示例中使用 hibernate 的标准时,它会返回第一个实体两次从而导致返回的实体比表中实际存在的实体多

实体定义

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;
}

}

获取实体的代码

@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

最佳答案

此处发生的情况是由于您已将 ItemParentCategory 作为 FetchType.EAGER 映射到 ItemSubcategory。

现在,这不会影响您的 HQL 查询,因为 HQL 查询不会遵循 EAGER 映射,并且要急于获取 HQL 中的子类别,您必须在查询中显式定义 FETCH JOIN。因此,在这种情况下一切都很好。

如果您将 HQL 更改为如下所示,您大多数都会遇到相同的重复问题:

从 ItemParentCategory ipc 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 queries always ignore the setting for outer-join or fetch="join" defined in mapping metadata. This setting applies only to associations fetched using get() or load(), Criteria queries, and graph navigation

示例查询必须以与标准查询类似的方式工作,并且您有 fetch = FetchType.EAGER Hibernate 正在执行显式连接。您应该打开 SQL 日志记录以查看每种情况下生成的实际 SQL。

关于java - Hibernate 的 Criteria With Examples 和 Query 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748904/

相关文章:

java - 将 Adob​​e CQ 5 连接到外部数据库?

java - 如何修复 SQL 错误、终止连接和 SQLState : 57P01

java - org.hibernate.MappingException : Foreign key (FK12A711396456CA10:) must have same number of columns as the referenced primary key

java - 使用复合键的 Hibernate 查找。列名无效异常

java - 每次初始化 log4j 时将当前时间附加到新的日志文件

java - 如何在不破坏当前设置的情况下安装多个版本的JDK?

java - 在 Clojure 中 : Error executing a Java call with let inside a function but not in REPL

java - Spring Boot + FreeMarker + RestController 加载模板

java - 按钮发布到当前地址

java - @Transactional 不适用于 spring 和 hibernate(如果没有 Activity 事务,get 无效)