2012-01-20 10 views
12

Załóżmy, że mam klasę domen o nazwie "Użytkownik", która może śledzić inne obiekty "Użytkowników". To nie tak, że pole określony jako:Jak wyszukiwać elementy, których kolekcja zawiera inny element w Grails?

def hasMany=[followedUsers:User] 

muszę zrobić odwrotnie (odnaleźć wszystkie obiekty użytkownika, które następują określonego obiektu użytkownika) bez konfigurowania odwrotną zależność, ponieważ nie jest to przypadek użycia wykonywane często . Starałem się zrobić coś takiego, za pomocą zamknięć:

User.findAll { it.followedUsers.contains(userInstance) } 

ale to zawsze zwraca wszystkich użytkowników w bazie danych, niezależnie od ich statusu obserwacji. Próbowałem robić z HQL, ale również niestety nie.

Czy ktoś może dać mi szybką wskazówkę na najprostszy sposób, aby to osiągnąć? Dziękuję Ci.

Odpowiedz

13

Możesz użyć tej kwerendy HQL:

User.executeQuery(
    'select u from User u where :follower in elements(u.followedUsers)', 
    [follower: userInstance]) 
+2

Dziękuję bardzo. Skończyło się na tym, że robiłem 'def followers = User.findAll (" od użytkownika, gdzie? W elementach (followUsers) ", [userInstance])'. Próbowałem wcześniej tego rozwiązania, ale brakowało mu wywołania funkcji "elements()" w celu jego uzupełnienia. – ArmlessJohn

0

Moim zdaniem ta składnia jest znacznie czystsze:

User.withCriteria { followedUsers{ eq('id', userInstance.id) } } 
Powiązane problemy