Использование groupProperty и countDistinct в критериях Грааля - PullRequest
5 голосов
/ 15 сентября 2010

Я использую Grails 1.2.4. Я хотел бы знать, как я могу сортировать по "countDistinct" (по убыванию) и с groupProperty внутри проекций.

Вот мои домены:

class Transaction {

    static belongsTo = [ customer : Customer, product : Product ]

    Date transactionDate = new Date()

    static constraints = {
        transactionDate(blank:false)    
    }

}

class Product {

    String productCode

    static constraints = {
        productCode(blank:false)    
    }
}

В терминах MySQL это то, что я хочу:

select 
    product_id,
    count(product_id)
from
    transaction
group by
    product_id
order by
    count(product_id) desc

В общем, я хотел бы получить список продуктов (или просто идентификатор продукта), отсортированный по количеству транзакций, которые были у продукта (по убыванию)

Это мое предположение:

def c = Transaction.createCriteria() def transactions = c.list {
    projections {
        groupProperty("product")
        countDistinct("product")
    }
    maxResults(pageBlock)
    firstResult(pageIndex) }

def products = transactions.collect { it[0] }

Но это не дает ожидаемого результата. Любое руководство по этому вопросу будет высоко оценено. Спасибо!

1 Ответ

9 голосов
/ 15 сентября 2010

Попробуйте это:

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 *

...