2012-09-05 11 views
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 
) 

しかし、私はどのようにこのようなクライテリアを作成するのか想像できません。この選択を基準でどのように実装するかについての考え方はありますか? 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)); 

しかし、それは動作しません。私はNullPointerExceptionresultCriteriaQuery.list()に持っています。このクエリで何が問題になっていますか?何か案は?

答えて

0

少し良くケースを分析するために、それが基準から自動的に生成されたHQL文を印刷し、あなたは、接続のプロパティで配置する必要が休止状態:

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

とデバッグにログインします。

これを取得したら、差分を生成して表示することができます。

よろしく、

0

あなたはCriteria.createCriteria(String)方法でサブ基準を作成することができます。次のシナリオを想定し

:文字列:

クラスBには名前があります。

クラスAには次の要素があります。

になりました(離れて他の制限から)のみ、オブジェクト名=「X」を持つ1件の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(); 
0

HibernateのクライテリアAPIでサポートされていない結合が非関連します。私が見るものから

FROM ObjectGroup g JOIN g.items i, Person per 

、あなたがObjectGroupItemと人との間に明示的なマッピングを作成する必要があります:この行が問題です。これはHibernate @ Anyアノテーションの手段によって達成されるかもしれません。 Hibernate Annotations、パラグラフ2.4.5.2を見てください。関連付けがマップされるときは、Criteria#createCriteria()またはCriteria#createAlias()を使用して、サブクエリに必要なジョインを追加します。正しいAPIを使用してメインクエリにサブクエリを追加しています。

関連する問題