【问题标题】:Narrowing the result of query by subquery通过子查询缩小查询结果
【发布时间】:2012-08-30 08:15:27
【问题描述】:

我正在尝试通过另一个查询的结果来缩小 Hibernate Criteria 查询的结果集。我知道如何用 JPQL 解决这个问题:

FROM DocPackage p WHERE
  EXISTS (SELECT g
    FROM ObjectGroup g JOIN g.items i, Person per
    WHERE g=p.applicantGroup
      AND i.objectClass = 'org.cp.model.common.Person'
      AND i.objectId=per.id
      AND lower(concat(per.firstName,' ',per.lastName)) like :applicant
  )

但我无法想象如何使用 Criteria 进行此类查询。任何想法如何使用标准实现此选择?使用 Hibernate 3.3。

UPD:为了解决这个问题,我进行了以下 Criteria 查询:

Criteria resultCriteriaQuery = this.hibernateSession.createCriteria(DocPackage.class, "pack");
        DetachedCriteria personSubquery = DetachedCriteria.forClass(Person.class, "pers").
            add(Restrictions.like("pers.loFstLstName", "%" + searchObject.getApplicant().toLowerCase() + "%")).
            add(Restrictions.eqProperty("itm.objectId", "pers.id"));
        DetachedCriteria applicantsSubquery = DetachedCriteria.forClass(ObjectGroup.class, "objGrp").
            add(Restrictions.eqProperty("pack.applcantGroup", "objGrp")).
            createAlias("objGrp.items", "itm").
            add(Restrictions.eq("itm.objectClass", "org.cp.model.common.Person")).
            add(Subqueries.exists(personSubquery));
        resultCriteriaQuery.add(Subqueries.exists(applicantsSubquery));

但它不起作用。我在resultCriteriaQuery.list() 上有一个NullPointerException。这个查询有什么问题?有什么想法吗?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    为了更好地分析这个案例,它会打印从标准自动生成的 HQL 语句,您必须将连接属性放入 hibernate:

    <property name="hibernate.show_sql" value="true" />
    <property name="hibernate.format_sql" value="true" />
    

    还有要调试的日志。

    一旦你有了它,你就可以比较你想要生成的并查看差异。

    问候,

    【讨论】:

      【解决方案2】:

      您可以使用Criteria.createCriteria(String) 方法创建子标准。

      假设如下场景:

      B 类有一个名字:String。

      A 类有一个元素:Set。

      您现在只想要(除了其他限制)有一个名称为“X”的 B 的 A 对象:

      Criteria crit = session.createCriteria(A.class);
      <add your restrictions for A>
      
      Criteria narrow = crit.createCriteria("elements");
      narrow.add(Restrictions.eq("name", "X");
      
      // This will respect the constraints applied to narrow
      crit.list();
      

      【讨论】:

        【解决方案3】:

        Hibernate Criteria API 不支持非关联联接。这一行有问题:

        FROM ObjectGroup g JOIN g.items i, Person per
        

        据我所知,您需要在 ObjectGroupItem 和 Person 之间创建一个显式映射。这可以通过 Hibernate @Any 注解来完成。看看Hibernate Annotations,第 2.4.5.2 段。当关联将被映射时,使用 Criteria#createCriteria() 或 Criteria#createAlias() 将必要的连接添加到子查询。您已经在使用正确的 API 向主查询添加子查询。

        【讨论】:

          猜你喜欢
          • 2021-01-22
          • 2021-11-24
          • 1970-01-01
          • 2021-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-29
          • 2022-11-18
          相关资源
          最近更新 更多