8

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

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

但这会返回所有对象,其中至少有一个状态为已完成的活动。我想检索所有活动状态设置为完成的人员列表。谁能帮我?

4

3 回答 3

2

以下是使用Criteria执行此操作的方法:

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

有点晚了,但我希望我能帮助那些仍然像我一样挣扎的人。

于 2017-07-18T13:47:38.983 回答
1

想否定它。检索那些有活动但没有处于不同状态的人Done。然后您可以简单地添加maxResults()list.get(0)(请记住,可能不包含任何人)。

于 2012-05-17T21:50:33.993 回答
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

于 2012-05-18T04:01:59.090 回答