简体   繁体   English

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

[英]Hibernate checking all elements equal in collection

I have two entities ie Person and Activity. 我有两个实体,即人和活动。 Activity has property status and Person entity contains collection of activities. Activity具有属性状态,Person实体包含活动集合。 I'd like to get a list of persons that have all activities with status 'Done'. 我想获得所有活动状态为“完成”的人员列表。

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

But this return all object with at least one activity with status done. 但是这会返回所有对象,其中至少有一个活动已完成状态。 I 'd like to retrive list of person with all activities status set to Done. 我想要将所有活动状态设置为“完成”的人员列表进行检索。 Can anyone help me? 谁能帮我?

Think in negate it. 想想否定它。 Retrieve those whose have activities and none is in state different of Done . 检索那些有活动但没有活动状态与Done状态不同的人。 Then you can simply add the maxResults() or list.get(0) (Bear in mind that might contain no person). 然后你可以简单地添加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

This should do the trick. 这应该可以解决问题。 Note that if you have lazy load, you may need to add "fetch" keyword in your Hibernate query. 请注意,如果您有延迟加载,则可能需要在Hibernate查询中添加“fetch”关键字。 Here is a useful link for joins: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-joins 这是一个有用的连接链接: http//docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-joins

Here is how you can do it with Criteria : 以下是如何使用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);

Kinda late but I hope I can help someone who still struggles with this as I did. 有点迟到但我希望我可以像我一样帮助那些仍在努力解决这个问题的人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM