2011-08-19 69 views
0

我有简单的用户项目模型。假设我需要选择所有例如最少5个用户的项目。 在SQL它会是这样的(我还没有尝试过,可能是错误的地方):使用休眠条件计算where条款

select * from PROJECTS p where count(select * from USERS u left join PROJECT_MEMBERS m on u.object_id=m.user_id where m.project_id=p.object_id)>5; 

在项目模型,我有:

private Set<UserModel> users = new HashSet<UserModel>(); 

及其映射这样的:

<set name="users" 
    cascade="none" 
    table="PROJECT_MEMBERS"> 
    <key column="project_id" /> 
    <many-to-many 
     column="user_id" 
     class="UserModelImpl"/> 
</set> 

目前吾道看起来像这样:

Criteria hbCriteria = session.createCriteria(ProjectModelImpl.class); 
hbCriteria.add(Restrictions.ilike("name", criteria.getProjectName(), MatchMode.ANYWHERE)); 
return hbCriteria.list(); 

如何添加创建标准,只选择那些具有criteria.getMinUsers()用户的项目?

让我知道如果你需要任何代码或映射

回答

1

这应该这样做:

.add(Restrictions.sizeGe("users", criteria.getMinUsers())) 
+0

+1。比我的好。 –

+0

这么简单......非常感谢:) –

0

弗拉德的解决方案肯定比这更好。无论如何,我都会让它告诉你如何使用子查询。

使用子查询:

Criteria hbCriteria = session.createCriteria(ProjectModelImpl.class, "project"); 
hbCriteria.add(Restrictions.ilike("project.name", criteria.getProjectName(), MatchMode.ANYWHERE)); 

DetachedCriteria count = DetachedCriteria.forClass("ProjectModelImpl.class", "project2"); 
count.createAlias("project2.users", "member"); 
count.add(Restrictions.eq("project2.id", "project.id"); 
count.setProjection(Projections.count("member.id"); 

hbCriteria.add(Subqueries.le(5, count)); 
return hbCriteria.list(); 
0

使用detachedCritera第一

DetachedCriteria countOfUsers = DetachedCriteria.forClass("ProjectModelImpl.class", "proj"); 
countOfUsers .createAlias("proj.users", "member"); 
countOfUsers .setProjection(proj.count("member.id"); 

使用别名上属性,然后使用别名来在其上创建的限制。

Criteria hbCriteria = session.createCriteria(ProjectModelImpl.class) 
hbCriteria.add(Restrictions.ilike("name", criteria.getProjectName(), MatchMode.ANYWHERE)) 
.add(Subqueries.ge(5,countOfUsers)); 
return hbCriteria.list();