1

尝试使用 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”,它会起作用。

我对变量或“like”引用做错了什么?我认为 % 符号基本上是搜索条件中的 * 符号?

我尝试了 2.0.0 形式的搜索:

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

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

4

1 回答 1

7

试试这个:

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

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


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

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

作为安全问题你真的,真的不应该用值 inline 来构建你的 HQL 语句。您应该改用命名参数。查看findAll文档中的一些中间示例。

于 2012-02-26T20:46:52.660 回答