2012-01-10 12 views
13

mam kod jak poniżej:Grails Najlepszym sposobem iteracyjne wszystkie identyfikatory klas domeny

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

Wydaje mi się trochę marnotrawstwo, że cały obiekt z każdej książki jest ładowany tylko do dostępu do ID. W Grails istnieje metoda load(), gdy chcesz operować tylko na identyfikatorze i zastanawiam się, czy istnieje tutaj odpowiednik do ładowania wszystkich instancji domeny? Czy powinienem używać HQL? Czy powinienem zostawić to tak, jak jest?

PS: To sprawia, że ​​zastanawiam się, czy nie powinna być opcja dostępna dla większości metod Gorm (dystansu etc), które powodują go tylko „obciążeniem” zamiast „dostać” klasę docelową

Odpowiedz

8

HQL można używać tylko do powrotu pola trzeba

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

+0

Powiedziałbym, że używając zapytania 'namedQueries' lub kryteria zapytania są dużo lepsze niż SQL dla czytelności, szczególnie, że zapytania stają się bardziej złożone. –

-2

Jeżeli przedmiot Książka zawiera dużo danych, po prostu pójdę z Book.list, aby zachować prostotę.

Pamiętaj, że obciążenie () nie trafia do bazy danych, a jedynie konstruuje obiekt o identyfikatorze.

+0

Właśnie próbowałem załadować i wydaje się, że trafia do bazy danych, jeśli próbujesz uzyskać dostęp do dowolnej właściwości innej niż id. – aldrin

+0

Tak, to jest powód użycia .load zamiast tylko nowej książki (id: 2), tworzy obiekt proxy, który leniwy ładuje obiekt przy dostępie. –

+0

Zgadzam się, że jeśli klasa Book nie ma dużo danych (mniej niż 100k) Używanie Book.list() jest prawdopodobnie w porządku. –

9

zapytaniu kryteria w połączeniu z projekcją rozwiązuje problemu, gdy chcesz uniknąć używania HQL.

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

Rejestrowanie Hibernate SQL pokazuje, że tylko identyfikatory są ładowane z bazy danych, a nie cały Książki: select this_.id as y0_ from book this_.

Zapytanie o kryteria można również dodać jako named query w klasie domeny Book, zapewniając łatwy dostęp do listy identyfikatorów.

5

+1 Dla @ odpowiedzi Ruben, ale można skrócić go po prostu

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

i uzyskać takie same wyniki!

Powiązane problemy