GORM createCriteria和list不会返回相同的结果:我该怎么办?

fab*_*474 7 grails grails-orm shiro nimble

我正在使用NimbleShiro作为我的安全框架,我刚刚遇到一个GORM错误.确实 :

User.createCriteria().list { 
   maxResults 10 
} 
Run Code Online (Sandbox Code Playgroud)

返回10个用户,User.list(max: 10) 返回9个用户!

经过进一步调查,我发现createCriteria 返回两次相同的用户(admin),因为admin有2个角色!(我不是在开玩笑).

似乎任何具有多于1个角色的用户将在createCriteria呼叫中返回两次并User.list返回max-1实例(即9个用户而不是10个用户)

我可以使用哪种解决方法来返回10个唯一身份用户?

这非常烦人,因为我无法正确使用分页.


我的域类是:

class UserBase { 
   String username 
   static belongsTo = [Role, Group] 
   static hasMany = [roles: Role, groups: Group] 
   static fetchMode = [roles: 'eager', groups: 'eager'] 
   static mapping = { 
     roles cache: true, 
     cascade: 'none', 
     cache usage: 'read-write', include: 'all' 
   } 
}

class User extends UserBase { 
  static mapping = {cache: 'read-write'} 
} 

class Role { 
  static hasMany = [users: UserBase, groups: Group] 
  static belongsTo = [Group] 
  static mapping = { cache usage: 'read-write', include: 'all' 
    users cache: true 
    groups cache: true 
  } 
} 
Run Code Online (Sandbox Code Playgroud)

Rub*_*ben 4

不太简洁和清晰,但使用 HQL 查询似乎是解决这个问题的一种方法。如Grails 文档(executeQuery 部分)中所述,可以将分页参数作为额外参数添加到executeQuery。

User.executeQuery("select distinct user from User user", [max: 2, offset: 2])
Run Code Online (Sandbox Code Playgroud)