此实现的GORM目前不支持像[executeQuery]这样的基于字符串的查询

Har*_*ari 7 security grails spring-security grails-orm mongodb

我正在尝试使用grails mongo插件在mongodb中持久化spring-security-acl域对象.执行以下代码行时

aclUtilService.addPermission Phone.class, phoneInstance.id, new PrincipalSid(username), BasePermission.ADMINISTRATION
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

此实现的GORM目前不支持像[executeQuery]这样的基于字符串的查询.使用标准代替.. Stacktrace如下:消息:此实现的GORM目前不支持像[executeQuery]这样的基于字符串的查询.改用标准.

任何艰难的?

**Grails Configuration Details:**
app.grails.version=2.0.3
app.name=eateri
app.servlet.version=2.5
app.version=0.1
plugins.mongodb=1.0.0.RC5
plugins.spring-security-acl=1.1
plugins.spring-security-core=1.2.7.2 
Run Code Online (Sandbox Code Playgroud)

cod*_*LMN 0

正如@sudhir提到的,aclService中有一些使用hqlexecuteQuery方法的方法,例如:

    protected AclObjectIdentity retrieveObjectIdentity(ObjectIdentity oid) {
        return AclObjectIdentity.executeQuery(
                "FROM AclObjectIdentity " +
                "WHERE aclClass.className = :className " +
                "  AND objectId = :objectId",
                [className: oid.type,
                 objectId: oid.identifier])[0]
        }
Run Code Online (Sandbox Code Playgroud)

但是mongodb gorm插件不支持hql,因此你的代码陷入hql错误的调用路径是这样的:

aclUtilService.addPermission -> aclService.createAcl ->retrieveObjectIdentity

以及另外两个使用 hql 的 aclService 方法:

删除条目,查找子项

因此,一个简单的解决方案是将 ACL 对象存储在 mysql 中,并启用 hibernate 与 mongodb gorm 一起工作

另一种方法是使用元编程重写这 3 个 aclService 方法。