搜索域类的每个属性

时间:2015-12-17 19:35:52

标签: grails gorm grails-3.0

假设我有这个域类:

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

是否有一种简单的方法可以搜索每个属性(因此我只需调用一种方法即可Personsnamestreet来搜索gender。像String s)?

如果没有:是否有比做更好的方式:

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

3 个答案:

答案 0 :(得分:1)

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

您的代码如下

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是您通常在控制器中使用的params映射。使用g:pagination和g:sortableColumn时,您可以在params映射中获得[max:,offset:,order:,sort:]值。如果您将这些传递给标准,您将自动获得一些分页结果。

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

答案 1 :(得分:0)

使用Person.where { name ==~ s || street ==~ s || gender ==~ s || foo ==~ s || bar ==~ s }.get() 查询:

=~
对于不区分大小写,可以使用

==~代替Color c = new Color(image.getRGB(x, y));

答案 2 :(得分:0)

我建议使用grails elastic search plugin

您可以通过添加属性

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

您还可以包含/排除字段

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