我有一个类似以下的域类:
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子查询实现此操作,并基于父级进行过滤。但是,我一直无法使用CreateCriteria构建器在Grails中找到一种方法。
如果有可能,有人可以提供我的见解吗?
如果可能的话,我宁愿不必在HSQL中实现这一点,但是可以接受有关如何实现这一点的建议......
我考虑过这些问题:
from Blog as b
where b.name like '%:query%' or b.id in ( select ... from tags where .... )
但我不确定要为标记表名指定什么,因为它不是域类,只是字符串列表。
谢谢!
答案 0 :(得分:1)
我相信你要搜索的是“elements”关键字(在HQL中)
然后查询将是:
def results = Blog.executeQuery('from Blogas b where :name in elements(tags) or b.name like :name', [name: "myGreatTagOrName"])
希望它有所帮助。
答案 1 :(得分:1)
这对我有用(使用grails 2.4.2):
def q = Blog.createCriteria ()
def r = q.list {
createAlias('tags', 't')
or {
like ("name", "Foo%")
like ("t.elements", "%b%")
}
}