2014-10-20 77 views
1

我有一个SQ:查询,我想在Grails中使用,但需要将其转换为HQL,因此我可以将它用于findAll方法。代码如SQL到HQL查询Grails

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在数据库上工作正常。

回答

2

您可以使用HQL中的类和字段名称以及SQL中的表和列名称。所以你不应该在HQL查询中看到下划线(至少不是很多)。此外,这不太可能是一个因素,但HQL查询从findAll运行,而从executeQuery运行的查询可能稍有不同。我不记得有什么区别,但executeQuery是正确的,不管涉及哪个域类。

很难知道没有看到域类,但它看起来像artifact_id应该是artifact.iddocument_id应该是document.id。而且由于你有Document实例,所以比较对象而不是它们的ID更适合于O-O。最后,我假设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]) 

请注意,您需要将参数值与分页控件分隔为两张地图。

+0

谢谢。我想出了使用类属性而不是表名。在域中它的artifactId而不是artifact_Id。我改变了这一点,它的工作 – krs8785 2014-10-20 20:25:17

1

你想要的方法是​​(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]) 
+0

我得到这个错误http://stackoverflow.com/questions/26471534/no-data-type-for-node-org-hibernate-hql-internal-ast-tree-identnode-hql – krs8785 2014-10-20 18:54:38