我有两个实体,即人和活动。 Activity具有属性状态,Person实体包含活动集合。我想获得所有活动状态为“完成”的人员名单。
Criteria crit = s.createCriteria(Person.class);
crit.createAlias("activities", "act").add(Restrictions.eq("act.status","Done"));
但是这会返回所有对象,其中至少有一个活动已完成状态。我想要将所有活动状态设置为“完成”的人员列表进行检索。任何人都可以帮助我吗?
答案 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);
有点迟到但我希望我可以帮助那些仍在努力解决这个问题的人。