繁体   English   中英

搜索域类的每个属性

[英]Search in every property of domain class

可以说我有这个域类:

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

有没有一种简单的方法在每个属性进行搜索(让我只需要调用一个方法来搜索Personsnamestreetgender ......像String s )?

如果不是:有没有比以下更好的方法:

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

上述答案的替代方法是使用条件。

您的代码如下

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

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

使用where查询:

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

对于大小写不敏感,可以使用=~代替==~

我建议使用grails弹性搜索插件

您可以通过添加属性来使您的域可搜索

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'
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM