2012-05-17 6 views
7

私はPersonとActivityの2つのエンティティを持っています。アクティビティにはプロパティステータスがあり、エンティティにはアクティビティのコレクションが含まれます。ステータスが「完了」のすべてのアクティビティを持つ人物のリストを取得したいのですが。コレクション内のすべての要素をチェックするHibernate

しかし、ステータスが完了した少なくとも1つのアクティビティを持つすべてのオブジェクトが返されます。私はすべての活動状況が完了に設定されている人のリストを検索したい。誰でも助けてくれますか?

答えて

0

これを否定します。アクティビティを持っていて、0以外の状態にあるものがない場合は、Doneを取得します。次に、maxResults()またはlist.get(0)を追加するだけです(人がいない場合もあります)。

1
// open hibernate session 
Query query = session.createQuery("Select p from Persons p inner join p.activities a where a.status = :code"); 
query.setParameter("code", "Done"); 
List results = query.list(); 

// close session 

for (int i = 0; i < results.size();){ 
    Person person = results.get(i); 
    List<Activity> activities = person.getActivities(); 
    for (int j = 0; j < activities.size(); j++){ 
    if (!activities.code.equals("Done")){ 
     results.remove(i); 
     break; 
    } // end if 
    } // end for j 
    i++; 
} // end for i 

これはトリックを行う必要があります。遅延ロードがある場合、Hibernateクエリに "fetch"キーワードを追加する必要があるかもしれないことに注意してください。 ここhttp://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-joins

0

はあなたが基準でそれを行うことができる方法である:ちょっと遅く

Criteria crit = s.createCriteria(Person.class); 

DetachedCriteria sub = DetachedCriteria.forClass(Person.class); 
sub.createAlias("activities","act"); 
sub.add(Restrictions.ne("act.status","Done")); 
sub.setProjection(Projections.property("id"); 

crit.add(Property.forName("id").notIn(sub); 

が、私は私が行ったように、まだこれで苦労誰かを助けることを願ってここで合流するための便利なリンクがあります。

関連する問題