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的主要内容,如果未能解决你的问题,请参考以下文章

HQL查询

hibernate hql查询 与Criteria 查询语句区别和效率

条件查询,SQL,JPQL,HQL

sql语句和hql语句的区别?

hql和sql的区别

HQL和SQL