我有以下查询,我使用Hibernate JPA提供:Hibernate的JPA递归查询
entityManager().createQuery(
"SELECT page FROM ProjectPage page"
+" left join fetch page.categorySet as category"
+ " where page.id = :id "
+ " and category.parentCategory is null "
+ " and (category.status is null or category.status != :status_val) "
,ProjectPage.class).setParameter("id", id).setParameter("status_val", Status.DELETED).getSingleResult();
及以下的ProjectPage
分别实体和Category
:
@Entity
@Table(name="project_page")
@Configurable
public class ProjectPage {
@OneToMany(mappedBy = "parentPage")
private Set<Category> categorySet = new HashSet<Category>();
}
@Configurable
@Table(name="category")
@Entity
public class Category{
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parentCategory",fetch=FetchType.EAGER)
private Set<com.se.dataadminbl.model.Category> categorySet = new HashSet<com.se.dataadminbl.model.Category>();
}
在上面
查询时,我试图取得与沿ProjectPage
其categorySet
并如上图所示Category
类包含一组它的类型,所以每ProjectPage
对象将包含一套Category
一第二本集将里面的每个对象包含了一组Category
,现在的问题是,当我取回ProjectPage
对象,其中仅适用于不能在每一个每个Category
内设置的第一级组的Category
子句中的条件,我想做一个递归查询,以便我可以将where条件应用到第n个级别,而不是用代码来做到这一点,我试图使用拦截器,但没有工作,任何想法如何做到这一点?
你想到的是强制执行'WHERE'在一个'OneToMany'关系的收集条件将允许您访问过滤行(根据条件)从集合 - 在你的情况,'categorySet'( '设置')通过父实体'页面?不,它不会发生。所以,请尝试改变方法。请不要也使用与'的'OneToMany'关系JOIN FETCH'(虽然它是由一些JPA提供商都支持)来过滤行(通过目标实体(有外键的一个)导航)别名使用,否则会改变对象的构建方式 –
Tiny
2015-01-15 19:28:55