Hibernate检查集合中相同的所有元素

时间:2012-05-17 21:39:24

标签: java hibernate

我有两个实体,即人和活动。 Activity具有属性状态,Person实体包含活动集合。我想获得所有活动状态为“完成”的人员名单。

   Criteria crit = s.createCriteria(Person.class);
   crit.createAlias("activities", "act").add(Restrictions.eq("act.status","Done"));

但是这会返回所有对象,其中至少有一个活动已完成状态。我想要将所有活动状态设置为“完成”的人员列表进行检索。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

思考否定它。检索那些具有活动但没有活动状态与Done不同的人。然后,您只需添加maxResults()list.get(0)(请记住,可能不包含任何人)。

答案 1 :(得分: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

答案 2 :(得分:1)

以下是使用条件

执行此操作的方法
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);

有点迟到但我希望我可以帮助那些仍在努力解决这个问题的人。