Использование groupProperty и countDistinct в критериях Grails

Я использую 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] }

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


person firnnauriel    schedule 15.09.2010    source источник


Ответы (1)


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

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") будет сортировать по количеству.

person ataylor    schedule 15.09.2010
comment
Благодарность! это сработало. однако вы не упомянули, как сортировать по 'count (product_id) desc' в createCriteria - person firnnauriel; 16.09.2010