2010-04-10 14 views
5

Tôi có một lớp người dùng mà hasMany = [bạn bè: User]Áp dụng tùy chọn pagination vào một danh sách một-nhiều trong Grails

Bây giờ tôi đang cố gắng để hiển thị danh sách bạn bè - $ {} user.friends

Tuy nhiên, tôi muốn có thể áp dụng các thông số như tôi có thể, ví dụ: User.findAllBy (người dùng, [max: 10, sort: 'dateCreated', order: 'desc "])

Ai đó có thể vui lòng cho tôi biết cách thực hiện điều này một lần trong Grails/Groovy?

Trả lời

3

Tôi muốn sử dụng HQL:

String hql = ''' 
select u from User u, User u2 
where u in elements(u2.friends) and u2=:user 
order by u.dateCreated desc 
''' 
int max = ... 
int offset = ... 
def friends = User.executeQuery(hql, [user: user], [max: max, offset: offset]) 

Bạn có thể thử lọc bộ sưu tập bạn bè, nhưng ngay sau khi bạn làm bất cứ thứ gì với nó sẽ được tải hoàn toàn từ cơ sở dữ liệu, vì vậy nếu bạn chỉ muốn 10 trường hợp, bạn sẽ lãng phí tải tất cả phần còn lại.

+0

Cảm ơn! Điều đó làm việc - Có cách nào tôi có thể bao gồm tổng số mà không cần phải thực hiện một truy vấn khác? - đối với pagination – RyanLynch

+0

Không, bạn cần phải thực hiện hai truy vấn vì truy vấn kết quả bị giới hạn bởi max và offset nhưng số đếm không thể, nó cần phải là tổng số. Grails mô phỏng điều này với một loại truy vấn tiêu chí trả về một PagedResultList, nhưng dưới mui xe nó chỉ chạy cả hai truy vấn cho bạn. –

+0

Truy vấn này thực sự chậm! – RyanLynch

0

Tôi chỉ đi qua các plugin GORM Labs cho Grails và nó cung cấp các chức năng sau

"Đối với mỗi 'hasMany' bất động sản, hiện nay là một phương pháp gắn liền với nó mất tính pagination (" bù đắp" và 'max' và tạo ra trang thích hợp, cũng có thuộc tính thể hiện "countBars" sẽ cung cấp tổng kích thước của bộ sưu tập "thanh". Điều này được thực hiện với truy vấn cơ sở dữ liệu riêng biệt nếu bộ sưu tập chưa được khởi tạo trước đó, vì vậy bạn có thể tránh tải tất cả các yếu tố của bộ sưu tập "

http://www.grails.org/plugin/gorm-labs

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