我有一个复杂的查询,我可以用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查询?
答案 0 :(得分:0)
在一个正在工作的项目中,我有几个sql查询,我无法转换为gorm(条件,where)。由于需要继续前进,我在grails中使用了本机sql查询,一切顺利。
请查看文章Using Hibernate Native SQL Queries以获取有关实施方法的说明。
我知道你不能总是决定使用哪种方法,但手头有这种设施总是有用的。
我希望它对你有用。问候