2010-09-15 22 views
5

Tôi đang sử dụng Grails 1.2.4. Tôi muốn biết làm thế nào tôi có thể sắp xếp theo "countDistinct" (giảm dần) và với groupProperty bên trong một phép chiếu.Sử dụng nhómProperty và countDistinct trong Tiêu chí Grails

Dưới đây là lĩnh vực của tôi:

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)  
    } 
} 

Về MySQL, đây là những gì tôi muốn:

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

Trong thuật ngữ chung, tôi muốn để có được một danh sách các sản phẩm (hoặc chỉ cần sản phẩm id) được sắp xếp theo số lượng giao dịch mà một sản phẩm có (giảm dần)

Đây là dự đoán của tôi:

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

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

Nhưng nó không cho kết quả mong đợi của tôi. Bất kỳ khách hàng tiềm năng nào về điều này sẽ được đánh giá cao. Cảm ơn!

Trả lời

7

Hãy thử điều này:

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

tiêu chí của bạn truy vấn thực sự là tương đương với:

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

Lưu ý rõ rệt. Bạn muốn tính số lượng giao dịch riêng biệt cho mỗi sản phẩm, do đó việc tính toán id giao dịch (hoặc bất kỳ thuộc tính giao dịch nào) có ý nghĩa hơn. Id sản phẩm chỉ xảy ra khi hoạt động mà không có mệnh đề riêng biệt.

Bạn có thể bật tính năng ghi nhật ký SQL hibernate siêu hữu ích để gỡ lỗi loại sự cố này. Nó sẽ cho bạn thấy chính xác cách các tiêu chí của bạn đang được chuyển đổi thành SQL. Khi chạy:

org.apache.log4j.Logger.getLogger("org.hibernate").setLevel(org.apache.log4j.Level.DEBUG) 

hoặc ném này trong Config.groovy của bạn:

environments { 
    development { 
     log4j = { 
      debug 'org.hibernate' 
      } 
    } 
} 

EDIT: sử dụng countDistinct("id", "transactionCount") như chiếu và order("transactionCount") sẽ sắp xếp theo số lượng.

+0

cảm ơn! nó đã làm việc. tuy nhiên, bạn không đề cập đến cách sắp xếp theo 'count (product_id) desc' trong createCriteria – firnnauriel

Các vấn đề liên quan