2015-01-15 874 views
0

我有以下查询,我使用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>(); 

} 
在上面

查询时,我试图取得与沿ProjectPagecategorySet并如上图所示Category类包含一组它的类型,所以每ProjectPage对象将包含一套Category一第二本集将里面的每个对象包含了一组Category,现在的问题是,当我取回ProjectPage对象,其中仅适用于不能在每一个每个Category内设置的第一级组的Category子句中的条件,我想做一个递归查询,以便我可以将where条件应用到第n个级别,而不是用代码来做到这一点,我试图使用拦截器,但没有工作,任何想法如何做到这一点?

+0

你想到的是强制执行'WHERE'在一个'OneToMany'关系的收集条件将允许您访问过滤行(根据条件)从集合 - 在你的情况,'categorySet'( '设置')通过父实体'页面?不,它不会发生。所以,请尝试改变方法。请不要也使用与'的'OneToMany'关系JOIN FETCH'(虽然它是由一些JPA提供商都支持)来过滤行(通过目标实体(有外键的一个)导航)别名使用,否则会改变对象的构建方式 – Tiny 2015-01-15 19:28:55

回答