通过子查询缩小查询结果

时间:2012-09-05 15:00:48

标签: java hibernate hibernate-criteria

我正在尝试通过另一个查询的结果来缩小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进行此类查询。有关如何使用Criteria实现此选择的任何想法?使用Hibernate 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));

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

3 个答案:

答案 0 :(得分:0)

分析案例好一点,它打印出从条件自动生成的HQL语句,你必须把连接属性放在hibernate中:

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

要调试的日志。

获得后,您可以与要生成的内容进行比较并查看差异。

此致

答案 1 :(得分:0)

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

假设以下情况:

B类的名称为:String。

A类有一个元素:Set。

你现在想要(除了其他限制)只有A对象,其中有一个名字=“X”的B:

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

答案 2 :(得分: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将子查询添加到主查询。

相关问题