как реализовать Subqueries.rowCount(DetachedCriteria dc)

Когда у DetachedCrieria есть проекции, как получить количество строк результирующего набора DetachedCrieria? Для HQL:

выберите количество (*) из (выберите имя, сумму (оценку) из группы баллов по имени).

Для спящего режима, как реализовать Subqueries.rowCount(DetachedCriteria dc)? Спасибо.


person Dave    schedule 21.02.2013    source источник


Ответы (2)


Если все, что вам нужно, это номер счетчика, почему бы просто не выполнить

select count(name) from score group by name
person overmeulen    schedule 21.02.2013
comment
нет. Это общее требование. У нас есть DetachedCriteria. Как получить размер результата запроса? - person Dave; 22.02.2013
comment
Выполнить его и увидеть возвращенное число или результаты? detachedCriteria.getExecutableCriteria(сессия).list().size() - person overmeulen; 22.02.2013
comment
Если результирующий набор содержит миллионы сущностей, будет ли он извлекать все сущности, а затем вычислять их размер? Если это зависит от базы данных, как насчет mysql? Благодарю. - person Dave; 23.02.2013
comment
Если вы не хотите извлекать объекты, вы можете попробовать это: detachedCriteria.getExecutableCriteria(session).setProjection(Projections.rowCount()).uniqueResult(). Он принимает ваши текущие критерии и переопределяет предложение select с количеством строк. - person overmeulen; 25.02.2013
comment
это работает, если у detachedCriteria нет проекций. Но если у него уже есть проекции, это не сработает. Спасибо - person Dave; 26.02.2013
comment
Почему? Если критерии уже имеют прогнозы, они будут переопределены, и прогнозы не изменят количество извлекаемых строк. - person overmeulen; 26.02.2013
comment
Например, выберите количество (*) из (выберите имя, сумму (оценку) из группы баллов по имени). Мне нравится знать количество строк результата подзапроса. detachedCriteria подзапроса имеет проекции. - person Dave; 26.02.2013
comment
Решение, которое я дал вам, преобразует ваше имя выбора detachedCriteria, сумму (оценку) из группы оценок по имени в исполняемый критерий выбора количества (*) из группы оценок по имени. Это даст вам именно то, что вы хотите, количество результатов для detachedCriteria без загрузки чего-либо! Изменение проекций здесь не имеет значения, так как мы работаем с другим экземпляром. - person overmeulen; 27.02.2013
comment
Возьмем простой пример: имя/сумма (оценка): A/100,B/200,C/300. Мне нравится получать число результатов, равное 3. Если заменить проекции на count(*), это даст мне 5,5,5, где 5 — количество оценок, которые имеет каждый учащийся, например, каждый учащийся имеет оценки по математике/английскому языку/фортепиано/спорту/программированию. - person Dave; 08.03.2013

У меня была такая же проблема... Я придумал следующее решение, и оно сработало:

myCriteria.setProjection(Projections.sqlProjection("count(*) as count from ( select distinct id , {alias}.enteredDate  ", new String[] { "count" }, new Type[] { StandardBasicTypes.LONG }));

// this is needed to close the parentheses opened in the Projection
myCriteria.add(Restrictions.sqlRestriction(" 1=1)"));
person Taby    schedule 06.03.2013
comment
Лучше расширить класс в Hibernate и реализовать его. То есть добавьте select count(*) к сгенерированному SQL DetachedCriteria. Но так и не придумал как. Спасибо, что поделился. - person Dave; 10.03.2013