2016-04-03 13 views
0

Ich brauche die letzten 10 registrierten Benutzer (normale Benutzer) in meiner Anwendung für Statistiken. Die Anwendung hat zwei Rollen: normaler Benutzer und Administrator.Hol dir die letzten 10 registrierten Benutzer - Spring security Grails

In meiner Benutzerklasse (Spring Security), ich habe das Datecreated Feld und ich kann die letzten 10 registrierten Benutzer in meinem Controller mit dieser Abfrage erhalten:

User.listOrderByDateCreated(max: 10, order: 'desc') 

Aber ich will einfach nur um es zu bekommen zwischen normalen Benutzern, außer Administrator. Mit dieser Abfrage kann ich alle normalen Benutzer erhalten:

UserRole.findAllByRole(role).user 

Welche Abfrage muss ich ausführen? Vielen Dank.

Antwort

1

Überraschenderweise dies ein heikles ist, weil Benutzer keinen direkten Griff Rolle hat, so dass die GORM Helfer so viel nicht helfen. Mit der direkten Groovy-Listen-Manipulation können wir erreichen, was Sie wollen.

Wenn Sie jedoch eine große Anzahl von Benutzern haben, wäre dies ein ineffizienter Weg, um 10 von ihnen zu erhalten. Eine bessere Option kann Hibernate Kriterien verwenden:

def users = UserRole.createCriteria().list(max: 2) { 
    eq "role", role 
    user { 
    order 'dateCreated', 'desc' 
    } 
    projections { property 'user' } 
} 

Oder wenn Sie möchten, können Sie mit HQL über executeQuery() abfragen:

def users = User.executeQuery("from User where id in (select user.id from UserRole where role.id = :roleId) order by dateCreated desc", [roleId: role.id], [max: 10]) 
+0

Ja, danke. Es klappt!! Obwohl mir das Kriterium nicht geht. Erste Benutzer- und Bestellsymbole erkennen nicht. –

+0

Stellen Sie sicher, dass Sie keine 'user'-Variable im Bereich irgendwo über Ihren Kriterien haben (d. H. Alles mit' def user = ... '). Ich habe mir letzte Nacht den Kopf darüber geschlagen. :) – ZacharyAKlein

+0

Jetzt funktioniert es. Das Problem war in "eq" Rolle ", Rolle". Jetzt funktionieren beide (Kriterien und HQL). Was ist die beste Methode in Bezug auf Leistung, Sicherheit usw.? –

1

Try this:

User.findAllByRole(role, 
       [max: 10, sort: "dateCreated", order: "desc"]) 
+0

Diese Abfrage funktioniert nicht, da Rolle kein Feld des Benutzers ist. Mit der ersten Abfrage kann ich alle normalen Benutzer (ohne Admins) erhalten. Diese Liste wird jedoch nicht gefiltert (max: 10 und sort: dateCreated). –

2

Versuchen Sie, diese

> User.executeQuery("from User user where user.id in (select userRole.user.id from UserRole userRole where userRole.role.id =:roleId) order by dateCreated desc", [roleId: role.id], [max: 10]) 

Andere Weg ist

UserRole.executeQuery("select ur.user from UserRole ur where ur.role.id =:roleId) order by ur.user.dateCreated desc", [roleId: role.id], [max: 10]) 

Lassen Sie es mich wissen, wenn es für Sie funktioniert .. :)

+0

Ja, danke. Es klappt!! –

+0

Bitte bewerten Sie es, wenn es für Sie arbeitet. Vielen Dank – Ashu

Verwandte Themen