我的Hibernate应用程序中有以下实体: -
Store, Item, Category
具有以下关系
Store
与Item
Category
与其他类别有多对多的关系(即父类别有子类别)
Item
与具有相同父类别的类别具有多对多关系。
我想要一个商店有项目的顶级类别列表。
我尝试了这个HQL查询,但它只返回一个顶级类别
String queryString = "select c.parentCategory from Category c where :store in elements(c.items)";
List categories = getSession().createQuery(queryString).setEntity("store", store).list();
请帮我解决这个问题。
提前致谢。
答案 0 :(得分:0)
之前我做过类似的事情,但略有简化。如果某个类别只能有一个父类,则可以将其建模为:
@Entity
public class Category
@OneToMany(mappedBy = "parentCategory", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Category> childCategories;
@ManyToOne
@JoinColumn(name = "parentCategoryId", nullable = true)
private Category parent;
查找顶级类别是查找父级为空的类别的简单案例。
sessionFactory.getCurrentSession().createQuery("from Category where parent is NULL")
这符合我的需要,但需要限制类别只能有一个父母。
答案 1 :(得分:0)
您可以在逻辑级别和ORM级别实现它,而不仅仅是在ORM级别。
首先,添加关系:商店与Category有一对多的关系 其次,在插入/更新/删除项目之前添加预处理器,以便在商店级别添加或删除类别。
public void preProcessForItemInserting(Item item){
Store store = getStoreDao().get( item.getStoreId() );
Set<Category> storeCategories = store.getCategories();
Set<Category> itemCategories = item.getCategories();
storeCategories.addAll( itemCategories );
getStoreDao().save( store );
}
//it is a little bit more complex than inserting logic
public void preProcessForItemUpdating(Item item){...}
//it is a little bit more complex than inserting logic
public void preProcessForItemDeleting(Item item){...}
总结一下,这是面向数据的设计和面向应用的设计的经典问题。我们可以根据重新发送而不仅仅是数据建模或仅仅是应用程序优化来调整我们的应用程序。