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

関連付けられていない結合は、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 に答える
0

ケースをもう少しよく分析するために、条件から自動的に生成された HQL ステートメントを出力します。接続プロパティを休止状態にする必要があります。

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

そしてデバッグするログ。

取得したら、生成したいものと比較して違いを表示できます。

よろしく、

于 2012-09-06T08:02:04.293 に答える