0

我有一个域类,如下所示:

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

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

谢谢!

4

2 回答 2

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

于 2014-07-31T22:02:15.340 回答
1

我相信您正在搜索的是“元素”关键字(在 HQL 中)

查询将是:

def results = Blog.executeQuery('from Blogas b where :name in elements(tags) or b.name like :name', [name: "myGreatTagOrName"])

希望能帮助到你。

于 2014-07-31T19:45:17.483 回答