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

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

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

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


认为否定它。 检索那些有活动,没有状态与Done状态不同的人。 然后,您可以简单地添加maxResults()list.get(0) (请注意,可能不包含任何人)。


// 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


以下是你如何使用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);

有点晚了,但我希望我能像我一样帮助那些仍在为之奋斗的人。

链接地址: http://www.djcxy.com/p/10767.html

上一篇: Hibernate checking all elements equal in collection

下一篇: Serialize prefix tree