2012-01-10 36 views
13

tôi có mã như thế này:Grails Cách tốt nhất để lặp tất cả các id của một lớp miền

Book.list().each { 
    // real code actually does something more useful 
    println "My id is " + it.id 
} 

Nó tấn công tôi như một chút của một sự lãng phí mà toàn bộ đối tượng của mỗi Sách đang được nạp chỉ để truy cập ID. Có một phương thức load() trong Grails khi bạn chỉ muốn hoạt động trên ID và tôi tự hỏi liệu có tương đương ở đây để tải tất cả các cá thể miền không? Tôi có nên sử dụng HQL không? Hay tôi nên để nó như thế?

PS: Nó làm cho tôi tự hỏi liệu có phải là một lựa chọn có sẵn cho hầu hết các phương pháp GORM (Finders vv) mà gây ra nó để chỉ "tải" thay vì "nhận được" lớp mục tiêu

Trả lời

8

Bạn có thể sử dụng HQL để chỉ trả lại các lĩnh vực bạn cần

Book.executeQuery("select b.id from Book b");

+0

Tôi muốn nói việc sử dụng truy vấn 'namedQueries' hoặc tiêu chí tốt hơn nhiều so với SQL vì mục đích dễ đọc, đặc biệt khi truy vấn của bạn phát triển phức tạp hơn. –

-2

Trừ khi đối tượng Book chứa rất nhiều dữ liệu, tôi sẽ đi với Book.list để giữ cho nó đơn giản.

Hãy nhớ rằng tải() không thực sự nhấn vào cơ sở dữ liệu, nó chỉ xây dựng một đối tượng có tập hợp id.

+0

tôi vừa thử tải và có vẻ như đang nhấn cơ sở dữ liệu nếu bạn cố truy cập bất kỳ thuộc tính nào khác ngoài id. – aldrin

+0

Vâng, đó là lý do để sử dụng .load thay vì chỉ mới Book (id: 2), nó tạo ra một đối tượng proxy mà lười biếng tải đối tượng truy cập. –

+0

Tôi đồng ý rằng nếu lớp Sách không có nhiều dữ liệu (ít hơn 100k) Sử dụng Book.list() có lẽ là ok. –

9

Một truy vấn tiêu chí kết hợp với một chiếu giải quyết vấn đề của bạn khi bạn muốn tránh sử dụng HQL.

def criteria = Book.createCriteria() 
    def result = criteria.list { 
     projections { 
      property 'id' 
     } 
    } 

Việc khai thác gỗ Hibernate SQL cho thấy rằng chỉ có các ID được nạp từ cơ sở dữ liệu, và không phải là toàn bộ Sách: select this_.id as y0_ from book this_.

Truy vấn tiêu chí cũng có thể được thêm dưới dạng named query trên lớp Miền sách, giúp dễ dàng truy cập vào danh sách ID.

5

1 Đối @ câu trả lời Ruben, nhưng bạn có thể rút ngắn nó lên để đơn giản

def criteria = Book.withCriteria { 
    projections { 
     property 'id' 
    } 
} 

và nhận được kết quả tương tự!

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