1

我正在尝试使用 createCriteria() 搜索具有特定角色的用户。我有三个域类:User、Role 和 UserRole(它们来自 SpringSecurity)。

class UserRole implements Serializable {

    User user
    Role role

    static constraints = {
        user nullbale: false
        role nullable: false
    }

    static mapping = {
        version: false
        id composite: ['role', 'user']
    }
}

我正在搜索 User Domain 上的 isActive、name 或 username 字段以及 Role Domain 上的 authority 字段。

    def c = UserRole.createCriteria()
    def results = c {
        user {
            eq("isActive", true)
            or {
                ilike("name", "somename")
                ilike("username", "someusername")
            }
        }
        role {
            eq("authority", "ROLE_USER")
        }
    }

在运行它时,我从 mongo 插件中得到 UnsupportedOperationException。这是堆栈跟踪

ERROR errors.GrailsExceptionResolver  - UnsupportedOperationException occurred when processing request: [GET] /users/search - parameters:
query: 
Join queries are not supported by MongoDB. Stacktrace follows:
Message: Join queries are not supported by MongoDB
    Line | Method
->>  162 | handle             in org.grails.datastore.mapping.mongo.query.MongoQuery$2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    142 | handle             in     ''
|   1091 | populateMongoQuery in org.grails.datastore.mapping.mongo.query.MongoQuery
|    993 | executeQuery       in org.grails.datastore.mapping.mongo.query.MongoQuery$58
|    861 | doInDB . . . . . . in     ''
|    833 | doInDB             in     ''
|    542 | list . . . . . . . in org.grails.datastore.mapping.query.Query
|    325 | invokeMethod       in grails.gorm.CriteriaBuilder
|     17 | $tt__searchUsers . in com.themopi.apis.searchactivity.SearchService
|     29 | searchUser         in com.themopi.apis.search.SearchController
|    198 | doFilter . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter           in grails.plugin.cache.web.filter.AbstractFilter
|    106 | processFilterChain in com.odobo.grails.plugin.springsecurity.rest.RestTokenValidationFilter
|     72 | doFilter           in     ''
|     53 | doFilter . . . . . in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|   1145 | runWorker          in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . . . . .  in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run                in java.lang.Thread

我在这个问题上找到了一个Jira,但它没有得到解决。

到目前为止,由于 jira 是在 2012 年 3 月 9 日创建的,或者我遗漏了什么?

我将在此查询中使用分页和投影?

非常感谢任何帮助或指导。

提前致谢。

4

1 回答 1

1

Burt有一篇关于这个主题的优秀文章。

它的主要部分之一是,安全模型应该用embedded/sub-doc entities. 实际上,根本不应该使用连接mongo,如果需要,请使用 RDBMS 或 Graph DB。

于 2014-09-19T11:42:27.240 回答