2016-04-03 15 views
0

統計のために私のアプリケーションで最後に登録した10人のユーザ(通常のユーザ)を取得する必要があります。アプリケーションには、通常のユーザーと管理者の2つの役割があります。最新の10人の登録ユーザを取得する - SpringセキュリティGrails

私のUserクラス(春のセキュリティ)で、私はdateCreatedフィールドを持っていると私はこのクエリと私のコントローラ内の最後の10人の登録ユーザー入手することができます。

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

をしかし、私はちょうどそれを取得したいです管理者を除く通常のユーザー間。このクエリを使用すると、すべての通常のユーザーを取得できます。

UserRole.findAllByRole(role).user 

実行するクエリは何ですか?ありがとう。

答えて

1

は、驚くべきことに、これは、トリッキーなものですので、GORMヘルパーは同じくらい役に立ちません。まっすぐなGroovyリスト操作を使って、あなたが望むものを得ることができます。

def users = User.list().findAll { it.authorities.contains role } 
.sort { it.dateCreated } 
.reverse() 
.take(10) 

//or… 

def users = UserRole.findAllByRole(role).user 
.sort { it.dateCreated } 
.reverse() 
.take(10) 

しかし、多数のユーザーがいる場合、これは10個を取得するのに非効率的な方法です。より良いオプションは、Hibernateの基準を使用することがあります

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

それともたい場合は、executeQuery()経由でHQLを使用して照会できます。

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

はい、ありがとうございます。できます!!基準は私には役に立たないが。最初のユーザーおよび注文記号は認識されません。 –

+0

あなたの基準のどこかのスコープに 'user'変数がないことを確認してください(つまり、' def user = ... 'を持つもの)。私はその最後の1夜に頭を打っていた。 :) – ZacharyAKlein

+0

今、それは動作します。問題は "eq" role "、role"にありました。今、両方(基準とHQL)が動作します。パフォーマンス、安全性などの点で最も良い方法は何ですか? –

1

はこれを試してみてください:ユーザーがロールに直接ハンドルを持っていないため

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

ロールはユーザーのフィールドではないので、このクエリは機能しません。最初のクエリでは、すべての通常のユーザー(管理者を除く)を取得できます。しかし、このリストはフィルタリングされません(max:10とsort:dateCreated)。 –

2

この

> 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]) 

その他の方法は

で試してみてください
UserRole.executeQuery("select ur.user from UserRole ur where ur.role.id =:roleId) order by ur.user.dateCreated desc", [roleId: role.id], [max: 10]) 

それがあなたのために働くかどうか教えてください。:)

+0

はい、ありがとうございます。できます!! –

+0

あなたのために働く場合、それを評価してください。ありがとう – Ashu

関連する問題