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