Grails findAll具有相似的值

use*_*124 1 grails findall

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

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

我想找到公司中所有人的名字或姓氏与输入的搜索类似(params.search存储在nameSearch变量中).如果我将第一个或最后一个值更改为特定名称"Tim"或"Johnson",则可行.

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

我尝试过2.0.0搜索形式:

        searchResults = Contact.findAll{
            company == params.company.id
            firstName == '%' + nameSearch + '%'
            lastName == '%' + nameSearch + '%'
        }
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.谢谢你的帮助

Rob*_*ska 7

尝试一下:

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

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


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

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

作为安全问题,您确实不应该使用内联值构建HQL语句.您应该使用命名参数.查看findAll文档中的一些中间示例.