在域 class 的每个 属性 中搜索

Search in every property of domain class

假设我有这个域 class:

class Person{
  String name
  String street
  String gender
  String foo
  String bar
  ...
}

有没有一种简单的方法可以在每个 属性 中搜索(这样我只需要调用一个方法来搜索 Personsnamestreetgender...喜欢String s)?

如果没有:有没有比这样做更好的方法:

Person.findByName(s)
Person.findByStreet(s)
...

使用where查询:

Person.where {
     name ==~ s || street ==~ s || gender ==~ s || foo ==~ s || bar ==~ s
}.get()

=~ 可以用来代替 ==~ 来区分大小写。

我建议使用 grails elastic search plugin

您可以通过添加 属性

使您的域可搜索
class Person{
  String name
  String street
  String gender
  String foo
  String bar
  ...
  static searchable = true
}

您还可以 include/exclude 字段

class Person{
  String name
  String street
  String gender
  String foo
  String bar
  ...
  static searchable = {
    except = 'foo'
  }
}

上述答案的替代方法是使用标准。

您的代码如下

String searchTerm = "something"
def criteria = Person.createCriteria()
def query = {
    or{
      ilike('name', "%${searchTerm}%") //Case insensitive like
      ilike('gender', "%${searchTerm}%")
      ilike('foo', "%${searchTerm}%")
      ilile('bar', "%${searchTerm}%")
      ...
    }       
}

def personInstanceTotal = Documento.createCriteria().count(query) //Returns the filtered count
def personInstanceList = Documento.createCriteria().list(params, query) //May return the paged results

现在您可能会注意到一个名为 params 的变量。 Params 是您通常在控制器中使用的参数映射。使用 g:pagination 和 g:sortableColumn 时,您可能会在 params 映射中获得 [max:, offset:, order:, sort:] 值。如果将这些传递给标准,您将自动获得一些分页结果。

这可能看起来不像其他选项那么简单,但在处理更复杂的查询时会非常灵活。也可以在 de query={} 声明中使用 ifs,这会变得非常方便。