【问题标题】:Problem with Hibernate/JPA Query and categoriesHibernate/JPA 查询和类别的问题
【发布时间】:2011-02-22 20:23:59
【问题描述】:

我有一个 Hibernate/JPA 数据模型,可以让我将对象 (MyObj) 放入各种类别 (MyCategory)。每个类别可能有 0 个或多个子类别,以及没有分配给它们的分类 (MyClassification) 的类别。数据模型如下所示:

public class MyObj {

    …

    protected MyCategory category = null;

    …
}

public class MyCategory {

    …

    protected MyClassification classification=null;

    protected List<MyCategory> childCategories=null;

    protected MyCategory parentCategory=null;

    …

}

public class MyClassification {

    …

}

我希望能够根据分类、类别或子类别查询 MyObj 实例。例如,如果我有 3 个分类(classA、classB 和 classC)和 6 个类别(例如 categoryA1、categoryA2、categoryB1 等,其中名称对应于分类)并且每个类别都有 3 个子类别(例如 subcatA1、 subcatA2、subcatA3、subcatB1 等)我想做这样的查询:

  • 分类 classA 中的所有 MyObj 实例(无论类别或子类别)
  • 类别 categoryA1 中的所有 MyObj 实例(不考虑子类别)

我创建了几个我认为可以完成此任务的 NamedQueries。它们适用于已将 MyObj 实例分配给子类别的实例。但是,如果我将 MyObj 实例放在一个类别(无子类别)中并基于类进行查询,我看不到它。我只看到子类别内的 MyObj 实例。我的查询如下所示:

MyObj.findByClass = "SELECT DISTINCT o FROM MyObj o WHERE (o.category.classification = :classification OR o.category.parentCategory.classification = :classification)"

MyObj.findByCategory = "SELECT DISTINCT o FROM MyObj o WHERE (o.category = :category OR o.category.parentCategory = :category)"

谁能告诉我这些查询的逻辑错误在哪里?有没有更好的方法来完成我所追求的?

【问题讨论】:

    标签: hibernate jpa hql categories


    【解决方案1】:

    您查询的问题是o.category.parentCategory 写成inner join category cat on cat.id=o.parent_category,如果parentCategoryNULL,您将不会得到任何结果。

    所以点导航意味着内部连接会导致OR 语句出现问题。您必须使用明确的 LEFT JOINsUNION 查询。

    顺便说一句,QueryDSL 允许编写如下语句:

    from(QCategory.category)
    .where(QCategory.category.classification.eq(classification).or(QCategory.category.left().parentCategory().left().classification.eq(classification))
    .listDisticnt(QCategory.category)
    

    SELECT DISTINCT o FROM MyObj o WHERE (o.category.classification = :classification OR o.category.parentCategory.classification = :classification)"

    【讨论】:

      【解决方案2】:

      我认为您在 OR 之后的第一个查询中缺少“分类”:

      MyObj.findByClass = "SELECT DISTINCT o FROM MyObj o WHERE (o.category.classification = :classification OR o.category.parentCategory.classification = :classification)"
      

      顺便说一句,我的感觉是遍历对象图比发出 HQL 查询更直接

      【讨论】:

      • 更正了查询中缺少的字段。
      • 是对的,SQL(或 HQL)无法以简单的方式在树中搜索...您可以使用您想要的分类搜索所有类别,然后使用第二个 HQL 搜索所有 Obj您找到的任何类别。
      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2021-02-19
      • 2015-12-09
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多