【问题标题】:Grails findAll with like values具有相似值的 Grails findAll
【发布时间】:2012-02-26 20:23:51
【问题描述】:

尝试使用 find all 简单地运行域对象查询,但它的行为不像我预期的那样:

searchResults = Contact.findAll("from Contact as c where c.company=${params.company.id} and c.firstName = '%${nameSearch}%'  or c.lastName = '%${nameSearch}%' ")

我想查找公司内所有名字或姓氏与输入的搜索类似的人(params.search 存储在 nameSearch 变量中)。如果我将 first 或 last 的值更改为特定名称“Tim”或“Johnson”,它会起作用。

我在使用变量或“喜欢”引用时做错了什么?我以为 % 符号基本上是搜索条件中的 * 符号?

我已经尝试了 2.0.0 形式的搜索:

        searchResults = Contact.findAll{
            company == params.company.id
            firstName == '%' + nameSearch + '%'
            lastName == '%' + nameSearch + '%'
        }

但这也没有用。谢谢大家的帮助

【问题讨论】:

    标签: grails findall


    【解决方案1】:

    试试这个:

    def company = Company.get(params.company.id)
    def searchResults = Contact.withCriteria {
        eq('company', company)
        or {
            ilike('firstName', '%' + nameSearch + '%')
            ilike('lastName', '%' + nameSearch + '%')
        }
    }
    

    如果您不想检索 Company 实例,则可以在 company { } 块中使用 idEq()


    您的 HQL 尝试有一些(可能更多)错误:

    • 您的 company 条件是将对象 (c.company) 与 id 值 (params.company.id) 进行比较
    • 您需要正确分组布尔逻辑,即(company AND (first OR last)),而不是(company AND first OR last)
    • 您应该使用like 而不是=,例如firstName like '%something%'

    As a matter of security你真的,真的不应该用内联值来构建你的 HQL 语句。您应该改用命名参数。查看findAll documentation 中的一些中间示例。

    【讨论】:

    • 谢谢 Rob - 这正是我正在使用的。快速浏览证明正是我所需要的,但我担心我的大量域条目。但是,我确实注意到并且无法弄清楚的一件事是如何处理两个类似的场景?我用 ilike(lastname) 或 ilike(firstName) 创建了标准,但没有运气。只需进行一次比较即可正常工作。
    • 没关系 - 我很好。我使用了基本的 findBy 和不太复杂的查询。再次感谢 Rob 向我介绍了这个查询代码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2012-03-13
    • 2016-04-07
    • 2018-10-23
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多