[英]count in where clause using hibernate criteria
我與用戶有一個簡單的項目模型。 假設我需要選擇所有具有至少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>
目前我的島看起來像這樣:
Criteria hbCriteria = session.createCriteria(ProjectModelImpl.class);
hbCriteria.add(Restrictions.ilike("name", criteria.getProjectName(), MatchMode.ANYWHERE));
return hbCriteria.list();
如何添加僅選擇具有criteria.getMinUsers()
用戶的項目的創建條件?
讓我知道是否需要更多代碼或映射
應該這樣做:
.add(Restrictions.sizeGe("users", criteria.getMinUsers()))
弗拉德的解決方案肯定比這更好。 無論如何,我在這里告訴您如何使用子查詢。
使用子查詢:
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();
首先使用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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.