2012-01-18 22 views
50

Với Grails, có một số cách để làm điều tương tự.Sự khác biệt giữa findAll, getAll và danh sách trong Grails

Finds tất cả các trường lớp miền:

Book.findAll() 
Book.getAll() 
Book.list() 

Lấy một thể hiện của lớp miền với id được chỉ định:

Book.findById(1) 
Book.get(1) 

Khi nào bạn sử dụng mỗi người? Có sự khác biệt đáng kể về hiệu suất không?

Trả lời

87

getAll là phiên bản nâng cao của get có nhiều id và trả về một List trường hợp. Kích thước danh sách sẽ giống như số id được cung cấp; bất kỳ lỗi nào sẽ dẫn đến một số null tại vị trí đó. Xem http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html

findAll cho phép bạn sử dụng truy vấn HQL và hỗ trợ phân trang, nhưng chúng không giới hạn trong trường hợp của lớp gọi điện để tôi sử dụng executeQuery thay thế. Xem http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html

list tìm tất cả các phiên bản và hỗ trợ phân trang. Xem http://grails.org/doc/latest/ref/Domain%20Classes/list.html

get truy xuất một cá thể bằng id. Nó sử dụng bộ nhớ cache dụ, vì vậy nhiều cuộc gọi trong cùng một phiên Hibernate sẽ dẫn đến nhiều nhất một cuộc gọi cơ sở dữ liệu (ví dụ: nếu phiên bản nằm trong bộ nhớ cache cấp 2 và bạn đã bật bộ nhớ cache này).

findById là một công cụ tìm năng động, giống như findByName, findByFoo vv Như vậy nó không sử dụng bộ nhớ cache dụ, nhưng có thể được lưu trữ nếu bạn có kích hoạt bộ nhớ đệm truy vấn (thường không phải là một ý tưởng tốt). get nên được ưu tiên vì bộ nhớ đệm của nó thông minh hơn rất nhiều; kết quả truy vấn được lưu trong bộ nhớ cache (ngay cả đối với một cá thể đơn lẻ như thế này) được xóa bi quan thường xuyên hơn bạn mong đợi, nhưng bộ nhớ cache của cá thể không cần phải quá bi quan.

Trường hợp sử dụng một lần mà tôi có cho findById là séc liên quan đến bảo mật, được kết hợp với một thuộc tính khác. Ví dụ: thay vì truy xuất cá thể CreditCard bằng cách sử dụng CreditCard.get(cardId), tôi sẽ tìm thấy người dùng hiện đã đăng nhập và sử dụng CreditCard.findByIdAndUser(cardId, user). Điều này giả định rằng CreditCard có thuộc tính User user. Bằng cách đó, cả hai thuộc tính phải khớp nhau và điều này sẽ chặn một hacker truy cập vào cá thể thẻ vì id thẻ có thể khớp, nhưng người dùng sẽ không.

4

AFAIK, đây là tất cả giống hệt

Book.findAll() 
Book.getAll() 
Book.list() 

Đây sẽ trả lại kết quả tương tự

Book.findById(1) 
Book.get(1) 

nhưng get(id) sẽ sử dụng bộ nhớ cache (nếu được kích hoạt), vì vậy nên được ưa thích để findById(1)

+3

Tuy nhiên, nếu bạn đang sử dụng bộ lọc ngủ đông, bạn cần sử dụng Book.findById(). Book.get() bỏ qua bộ lọc. –

+0

@Brad thêm câu trả lời này làm câu trả lời và toàn bộ nhóm của tôi sẽ upvote – Armand

11

Sự khác biệt giữa Domain.findByID (id) và Domain.get (id) là nếu bạn đang sử dụng bộ lọc ngủ đông, bạn cần sử dụng Domain.findById (id). Domain.get (id) bỏ qua bộ lọc.

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