【问题标题】:Grails - Perform WHERE IN subquery using CreateCriteriaGrails - 使用 CreateCriteria 执行 WHERE IN 子查询
【发布时间】:2014-09-23 21:01:27
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: hibernate grails hsqldb createcriteria


    【解决方案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

    【讨论】:

    • 在 2.4.2 中使用它时,我仍然得到“org.hibernate.MappingException:collection was not an association”。我还发现这是一个仍然存在的已知问题:GRAILS-5887
    【解决方案2】:

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

    查询将是:

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

    希望对你有帮助。

    【讨论】:

    • 谢谢。不过,您上面的内容仅适用于完全匹配的字符串。你知道是否有办法通过类似条件过滤标签吗?
    • 抱歉,帮不上忙,我最好的解决方案是使用单个字符串实际创建一个域对象,使用 Tag.findAllByTagNameLike("whateverYouWannaSearch") 进行搜索,然后在查询中使用它与上述类似。但这不是一个单一的查询,我认为这不是你想要做的......
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2011-10-02
    • 2011-07-06
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多