GORM 的这个实现目前不支持基于字符串的查询,如 [executeQuery]

Posted

技术标签:

【中文标题】GORM 的这个实现目前不支持基于字符串的查询,如 [executeQuery]【英文标题】:String-based queries like [executeQuery] are currently not supported in this implementation of GORM 【发布时间】:2012-06-26 08:56:27 【问题描述】:

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

aclUtilService.addPermission Phone.class, phoneInstance.id, new PrincipalSid(username), BasePermission.ADMINISTRATION

我收到以下错误:

String-based queries like [executeQuery] are currently not supported in this  implementation of GORM. Use criteria instead.. Stacktrace follows:
Message: String-based queries like [executeQuery] are currently not supported in this implementation of GORM. Use criteria instead.

有什么困难吗?

Grails 配置详情:

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 

【问题讨论】:

GORM for mongo db 不支持 HQL 查询 - aclUtilService.addPermission 可能使用了导致此错误的 hql 您在运行单元测试时是否遇到过这种情况?它不支持单元查询: @ACM64 - 不在单元测试期间。它在运行应用程序期间 我在 mysql 上遇到了与 GORM 相同的异常,我认为 Grails 在测试中通常不支持字符串查询。 【参考方案1】:

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

    protected AclObjectIdentity retrieveObjectIdentity(ObjectIdentity oid) 
        return AclObjectIdentity.executeQuery(
                "FROM AclObjectIdentity " +
                "WHERE aclClass.className = :className " +
                "  AND objectId = :objectId",
                [className: oid.type,
                 objectId: oid.identifier])[0]
        

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

aclUtilService.addPermission -> aclService.createAcl -> 检索对象身份

还有另外两个使用 hql 的 aclService 方法:

删除条目,查找儿童

因此,一个简单的解决方案是将 ACL 对象存储在 mysql 和 enable hibernate working with mongodb gorm 中。

另一个是用meta programming覆盖这3个aclService方法。

【讨论】:

以上是关于GORM 的这个实现目前不支持基于字符串的查询,如 [executeQuery]的主要内容,如果未能解决你的问题,请参考以下文章

Gorm 预加载及实现联表条件查询仿WhereHas

使用 hasmany 字符串查询 Grails / GORM 条件

修改gorm支持protobuf

如何对 GORM 子文档字段进行不同的查询?

go语言对gorm不固定条件查询封装

Grails 查询不使用 GORM