GRAILS / GORM:动态多重连接

时间:2018-01-19 20:39:49

标签: grails gorm

我有一个复杂的查询,我可以用SQL解决但我找不到合适的GORM方法来做同样的事情。

我有Story对象。每个Story对象引用许多Tag对象。这是一个单向的OneToMany关系:

class Story {
...
    Collection tags
    static hasMany = [
        tags: Tag
    ]
...
}

几个标签被认为是“别名”(技术上使用单独的“AliasGroup”表,这不是问题)。

现在,我想搜索多个标签。返回的故事必须使用所有这些标记进行标记(“匹配所有标记”)。但是,对于每个标签,还应该接受“别名”标签。

在SQL中,我通过使用动态组合的连接序列来解决这个问题。例如,如果给出了两个标签,两个标签都有几个“别名”,则生成的SQL语句如下所示(使用实际的SQL行名称):

select s.id from story 
   join story_tag st1 on s.id = st1.story_id 
   join story_tag st2 on s.id = st2.story_id 
where 
   st1.tag_id in (<list of ids for tag1 and all its aliases>) and
   st2.tag_id in (<list of ids for tag2 and all its aliases>)

重要的是要理解这不能写成单个连接,因为SAME标签必须位于两组标签列表中,这不是我想要的。

所以,这句话工作正常。但我想直接使用grails来实现同样的目的。关于连接的GORM文档相当简洁,但我认为使用关联查询和'和'它们在一起的功能将给出正确的结果。所以我试过了:

def c = Story.createCriteria()
def stories = c.list {
    and {
        srchTags.each { tag ->
            def ids = []

            tag.aliasGroup.aliases.each { alias ->
                ids << alias.id
            }

            tags {
                inList('id', ids)
            }
        }
    }
}

如果我只使用一个标记作为输入,这可以正常工作。即正确解析别名标签ID列表,并且该声明原则上正在工作。

但是如果我使用两个或更多标签,它就无法正常工作。代码运行,但GORM似乎只是创建了错误的SQL查询,似乎它再次尝试将每个标记与所有无法正常工作的匹配列表相匹配。

我意识到这个问题不易理解,而且更难以正确描述。

有没有人有解决方案如何为此问题创建正确的Grails查询?

1 个答案:

答案 0 :(得分:0)

在一个正在工作的项目中,我有几个sql查询,我无法转换为gorm(条件,where)。由于需要继续前进,我在grails中使用了本机sql查询,一切顺利。

请查看文章Using Hibernate Native SQL Queries以获取有关实施方法的说明。

我知道你不能总是决定使用哪种方法,但手头有这种设施总是有用的。

我希望它对你有用。问候