Попробуйте это:
def c = Transaction.createCriteria()
def transactions = c.list {
projections {
groupProperty("product")
countDistinct("id")
}
maxResults(pageBlock)
firstResult(pageIndex)
}
Ваш критерий запроса фактически эквивалентен:
select
product_id,
count(**distinct** product_id)
from
transaction
group by
product_id
order by
count(product_id) desc
Обратите внимание на отличительные.Вы хотите посчитать количество отдельных транзакций для каждого продукта, поэтому подсчет идентификатора транзакции (или любого свойства транзакции) имеет больше смысла.Идентификатор продукта просто работает без отдельного предложения.
Вы можете включить очень полезный режим ведения журнала SQL в спящем режиме для устранения проблем такого рода.Он покажет вам, как ваши критерии преобразуются в SQL.Во время выполнения:
org.apache.log4j.Logger.getLogger("org.hibernate").setLevel(org.apache.log4j.Level.DEBUG)
или добавьте это в свой Config.groovy:
environments {
development {
log4j = {
debug 'org.hibernate'
}
}
}
РЕДАКТИРОВАТЬ: используйте countDistinct("id", "transactionCount")
в качестве проекции и order("transactionCount")
отсортирует по количеству.1017 *