2012-09-19 10 views
8

Mam następujące klasy domeny:Grails: znaleźć przez stowarzyszenie jeden-do-wielu sznurkiem

class User { 
    static hasMany = [roles:String] 
} 

chciałbym znaleźć każdemu użytkownikowi, który ma rolę ROLE_ADMIN. Czy jest to możliwe dzięki dynamicznym wyszukiwarkom? user.findAllByRoles('ROLE_ADMIN') wydaje mi się błąd.

UPDATE: jest to dość łatwe do kwerendy stowarzyszenie gdzie klasa A ma listę klasa B przypadkach i zarówno A i B są klasy domeny. Ale tutaj klasa A jest klasą domeny, a klasa B jest prostym łańcuchem Java.

Kod dla zapytań stowarzyszenie zawierający listę kolejnych obiektów domeny będzie wyglądać następująco:

`User.findAll { roles { role_name=='ROLE_ADMIN' } }` 

Co szukam jest sposobem na określenie wartości ciągu, na przykład:

`User.findAll { roles {THIS_VALUE=='ROLE_ADMIN' }}` 

UPDATE 2: o ile znalazłem, nie można używać kryteriów z kolekcjami typów pierwotnych. Jest możliwe użycie HQL choć:

User.findAll("from User a where :roles in elements(roles)",[roles:'ROLE_ADMIN']) 

Jednak to nie jest tak usefull jako findAll lub where zapytania. Nie mogę połączyć metod findAll w celu zdefiniowania innych metod, na przykład: uzyskanie ROLE_ADMIN użytkowników o nazwie użytkownika takiej jak "xxx" wymaga przepisania całego zapytania HQL. Być może możliwe jest wyrażenie powyżej stanu HQL w postaci wyrażenia where?

+0

Jaki błąd dostałeś? Po prostu mówienie, że dostajesz, jest mniej niż użyteczne. – cdeszaq

+0

Po prostu nie działa, podaje błąd dotyczący niepoprawnego zapytania do hibernacji (ten parametr nr 1 nie jest ustawiony) i widzę w zapytaniu 'where id =?', Dlatego myślę, że metoda 'findAllByRoles' nie miała żadnego efektu. Myślę, że musi istnieć inny sposób sprawdzania skojarzeń, które zawierają proste typy, takie jak 'String' – Pma

+0

Sprawdź rozwiązanie przy użyciu kryteriów GORM tutaj: http://stackoverflow.com/a/24211973/3738761 –

Odpowiedz

5

Być może można zrobić coś takiego:

jeśli masz już listę użytkowników (UserList)

def list = userList.findAll { user -> user.roles =~ 'ROLE_ADMIN' } 

nadzieję, że to pomaga!

+1

Myślę, że ten kod kryteriów nie działa. .. co znaczy tutaj "tag"? – Pma

Powiązane problemy