【问题标题】:Hibernate JPA recursive queryHibernate JPA 递归查询
【发布时间】: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();

以下分别是ProjectPageCategory的实体:

@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&lt;Category&gt;) 通过父实体page?不,这不会发生。所以,请尝试改变方法。请不要在 OneToMany 关系中使用带有 JOIN FETCH 的别名(尽管某些 JPA 提供程序支持)来过滤行(以导航目标实体(具有外键的实体)),否则会改变对象是如何构建的

标签: java sql hibernate jpa recursion


【解决方案1】:
  1. 当您在 WHERE 子句中引用 LEFT JOIN 列时,WHERE 条件将始终过滤掉空值。所以最终结果是一个 INNER JOIN。

  2. JPA 和 Hibernate 都不支持递归查询,因为 there's no one and only one standard implementation amongst all databases Hibernate supports

  3. 如果你使用 PostgreSQL,你可以使用Common Table Expression

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 2016-03-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2015-09-18
    相关资源
    最近更新 更多