6

我正在尝试通过另一个查询的结果来缩小 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 进行这样的查询。任何想法如何使用标准实施此选择?使用休眠 3.3。

UPD:为了解决这个问题,我做了以下标准查询:

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));

但它不起作用。我有一个NullPointerExceptionresultCriteriaQuery.list()这个查询有什么问题?有任何想法吗?

4

3 回答 3

0

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();
于 2012-09-06T08:44:45.250 回答
0

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

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

以及要调试的日志。

拥有它后,您可以比较要生成的内容并查看差异。

问候,

于 2012-09-06T08:02:04.293 回答
0

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 向主查询添加子查询。

于 2013-10-13T19:36:02.840 回答