рассчитывать в где пункт, используя критерии гибернации - PullRequest
0 голосов
/ 19 августа 2011

У меня есть простая модель проекта с пользователями.Предположим, мне нужно выбрать все проекты, которые имеют, например, минимум 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() пользователей?

Дайте мне знать, если вам нужен еще код или отображение

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Это должно сделать:

.add(Restrictions.sizeGe("users", criteria.getMinUsers()))
0 голосов
/ 19 августа 2011

сначала используйте 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();
0 голосов
/ 19 августа 2011

Решение Влада определенно лучше, чем это.В любом случае, я здесь позволю вам показать, как можно использовать подзапросы.

Использовать подзапрос:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...