【发布时间】:2015-03-14 06:17:05
【问题描述】:
我有以下查询,我正在使用 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 对象时,where 子句中的条件仅适用于Category 的第一级集合而不是每个 Category 中的每个集合,我想进行递归查询,以便我可以将 where 条件应用于第 n 级而不是使用代码执行此操作,我尝试使用拦截器但不起作用,任何想法如何这样做?
【问题讨论】:
-
您是否期望在
OneToMany关系中的集合上强制执行WHERE条件将允许您从该集合访问过滤的行(根据条件) - 在您的情况下,@987654336 @(Set<Category>) 通过父实体page?不,这不会发生。所以,请尝试改变方法。请不要在OneToMany关系中使用带有JOIN FETCH的别名(尽管某些 JPA 提供程序支持)来过滤行(以导航目标实体(具有外键的实体)),否则会改变对象是如何构建的
标签: java sql hibernate jpa recursion