我有一个简单的项目模型与用户。假设我需要选择所有项目,例如至少有5个用户。 在sql中它会是这样的(我没有尝试过,可能在某处出错):
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>
目前我的dao看起来像这样:
Criteria hbCriteria = session.createCriteria(ProjectModelImpl.class);
hbCriteria.add(Restrictions.ilike("name", criteria.getProjectName(), MatchMode.ANYWHERE));
return hbCriteria.list();
如何添加仅选择那些拥有criteria.getMinUsers()
个用户的项目的创建条件?
如果您需要更多代码或映射
,请与我们联系答案 0 :(得分:1)
这应该做:
.add(Restrictions.sizeGe("users", criteria.getMinUsers()))
答案 1 :(得分: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();
答案 2 :(得分: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();