我有一个像这样的域类:
class Blog {
String name
Set tags = []
static constraints = {}
static hasMany = [tags: String]
}
我有一个搜索例程,我希望能够根据名称和标签集合进行过滤。
def results = Blog.createCriteria().list(params) {
def query = params.query?.trim()
if(query) {
or {
like("name", "%${query}%")
like("tags", "%${query}%") <--- This does not work...
}
}
}
在SQL中,我将使用针对标记表的WHERE In子查询来实现这一点,并基于父查询进行过滤。然而,我一直无法找到一种方法来做到这一点,在Grails中使用CreateCriteria构建器。
如果可能的话,有人能给我提供一些见解吗?
如果可能的话,我宁愿不必在HSQL中实现这一点,但会对如何实现这一目标的建议持开放态度…
我考虑过这样的事情:
from Blog as b
where b.name like '%:query%' or b.id in ( select ... from tags where .... )
但是我不确定要为标签表名称指定什么,因为它不是一个域类,只是一个字符串列表。
谢谢!
我相信你正在搜索的是"elements"关键字(在HQL中)
查询将是:
def results = Blog.executeQuery('from Blogas b where :name in elements(tags) or b.name like :name', [name: "myGreatTagOrName"])
希望能有所帮助。
我用的是grails 2.4.2:
def q = Blog.createCriteria ()
def r = q.list {
createAlias('tags', 't')
or {
like ("name", "Foo%")
like ("t.elements", "%b%")
}
}
从:https://stackoverflow.com/a/24211973/1262371