Grails - 使用CreateCriteria在子查询中执行WHERE

时间:2014-07-31 19:06:42

标签: hibernate grails hsqldb createcriteria

我有一个类似以下的域类:

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 .... )

但我不确定要为标记表名指定什么,因为它不是域类,只是字符串列表。

谢谢!

2 个答案:

答案 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%")
        }
    }

来自:https://stackoverflow.com/a/24211973/1262371