2011-10-19 24 views
5

Tôi có một lớp tên miền được gọi là Order và lớp đó có mối quan hệ hasMany với lớp Item. Khi tôi đang truy vấn danh sách các đơn đặt hàng có các hạn chế nhất định, tôi nhận được nhiều trường hợp Order vì có items.Truy vấn tiêu chí Grails tuyển dụng các trường hợp trùng lặp

Vì vậy, ví dụ Order trường hợp đã nói tham chiếu đến 3 trường hợp Item thì, tiêu chí gọi trên Order sẽ trả về 3 trường hợp trùng lặp là Order. Tôi không chắc chắn nhưng nếu điều đáng nói đến là lớp miền OrderfetchMode được đặt thành "eager".

Tôi thực sự bối rối với những gì đang xảy ra ở đó. Bất kỳ trợ giúp trong lĩnh vực này sẽ được đánh giá rất nhiều. Đoạn mã được kèm theo:

def clazz = "cust.Order" 
def criteria = clazz.createCriteria() 
     println("clazz == "+Order.list())// returning correct data i.e unique instance of order 
     def filter = { 
        // trimmed down all filtering criteria for debugging 
      }//close filter 
     List results = criteria.list(max:params?.max,offset:params?.offset,filter) 
      results.each{Object data-> 
       println(data.getClass()) 
      } 
     println("results == "+results) 

Cảm ơn một lần nữa

Trả lời

2

Tiêu chuẩn API chỉ là một wrapper cho xây dựng một truy vấn SQL. Trong trường hợp của bạn, truy vấn được đề cập có JOIN trong đó (do tìm nạp mong muốn) và trả về một sản phẩm Descartes của Đơn đặt hàng và các mục phù hợp của chúng. Mỗi hàng được trả lại được bao gồm trong các kết quả dưới dạng một cá thể Đơn đặt hàng riêng biệt.

Cách đơn giản nhất để loại bỏ các bản sao là để đặt tất cả các kết quả trong một Set, như thế này:

def resultSet = new HashSet() 
resultSet.addAll(results) 
println("results == " + resultSet) 
+0

Điều này đã hiệu quả nhưng có cách nào tốt hơn để giải quyết vấn đề này không? Giống như thay đổi chế độ tìm nạp trong khi truy vấn hoặc bất kỳ điều gì như vậy? – Amit

3

Nếu bạn gọi criteria.listDistinct thay vì criteria.list bản sao sẽ được loại bỏ

+0

Cần lưu ý rằng điều này có thể thay đổi loại kết quả từ một ResultSet thành Danh sách đối tượng Miền (ngắt trang trong một số trường hợp). – bschipp

+1

Bạn không thể thêm các tham số như max hoặc offset với listDistinct (phương thức listDistinct() không hoạt động tốt với các tùy chọn phân trang maxResult và firstResult. Nếu bạn cần kết quả riêng biệt với pagination, chúng tôi khuyên bạn nên sử dụng HQL), ít nhất là trong grails 2.x hoặc dưới – GSAN

0

Bạn cũng có thể sử dụng động những người tìm kiếm, như trong Order.findAllBy * .Trên bộ lọc của bạn phức tạp như thế nào, điều này có thể dễ dàng hoặc khó khăn :)

+0

Bộ lọc của tôi khá phức tạp và rất năng động, tôi không nghĩ findBy sẽ hoạt động trong trường hợp này. Bộ lọc cũng áp dụng cho các đối tượng lồng nhau. Đó là một trong những lý do tôi quyết định sử dụng các tiêu chí trên SQL tự nhiên – Amit

3

Một giải pháp là sử dụng điều này bên trong truy vấn của bạn:

resultTransformer org.hibernate.Criteria.DISTINCT_ROOT_ENTITY 
Các vấn đề liên quan