SQL 到 HQL 查询 Grails
Posted
技术标签:
【中文标题】SQL 到 HQL 查询 Grails【英文标题】:SQL to HQL query Grails 【发布时间】:2014-12-15 15:36:01 【问题描述】:我有一个 SQ: 查询,我想在 Grails 中使用它,但需要将其转换为 HQL,以便我可以将它用于 findAll 方法。代码如下
artifacts = Artifact.findAll(
"FROM Artifact WHERE id NOT IN ( " +
"SELECT artifact_id FROM Classification " +
"WHERE active = :active) AND document_id =:doc_id",
[active: '1', doc_id:document.id, max:limit, offset:startIndex])
这给了我 stringIndexOutofBounds 错误。我认为这可能是因为 SQL 在数据库上运行良好的语法。
【问题讨论】:
【参考方案1】:您在 HQL 中使用类名和字段名,在 SQL 中使用表名和列名。所以你不应该在 HQL 查询中看到下划线(至少不是很多)。此外,这里不太可能是一个因素,但是从 findAll
运行的 HQL 查询和从 executeQuery
运行的查询可能略有不同。我不记得有什么区别,但executeQuery
是正确的,无论涉及哪个域类。
不看域类很难知道,但似乎artifact_id
应该是artifact.id
,而document_id
应该是document.id
。而且由于您有 Document 实例,因此比较对象而不是它们的 ID 更合适。最后,我假设 active
是一个布尔属性,所以它需要一个布尔值而不是 1 或 0。所以,把所有这些放在一起,我最好的猜测是这就是你想要的:
def artifacts = Artifact.executeQuery(
"FROM Artifact WHERE id NOT IN ( " +
"SELECT artifact.id FROM Classification " +
"WHERE active = :active) AND document =:doc",
[active: true, doc:document],
[max:limit, offset:startIndex])
请注意,您需要将分页控件中的参数值分成两个地图。
【讨论】:
谢谢。我发现使用类属性而不是表名。在域中它的 artifactId 而不是 artifact_Id。我改变了它,它工作了【参考方案2】:您想要的方法是 findAll(String query, Map namedParams, Map queryParams) 但您的 namedParams 和 queryParams 在同一个数组中。将它们分开,它应该可以工作。
artifacts = Artifact.findAll(
"FROM Artifact WHERE id NOT IN ( " +
"SELECT artifact_id FROM Classification " +
"WHERE active = :active) AND document_id =:doc_id",
[active:'1', doc_id:document.id],
[max:limit, offset:startIndex])
【讨论】:
我收到此错误***.com/questions/26471534/…以上是关于SQL 到 HQL 查询 Grails的主要内容,如果未能解决你的问题,请参考以下文章