Grails如何基于不同的搜索参数进行动态搜索

Grails如何基于不同的搜索参数进行动态搜索,grails,groovy,Grails,Groovy,假设我们必须对一组数据库记录执行搜索,搜索条件由几个复选框和一个文本字段定义。因此,如果勾选了“美国公民”复选框,文本字段“姓名”将填入“John Doe”。然后,我在Grails应用程序中的搜索将类似于: def results = IndividualRecord.findAllWhere(citizenship: 'US', name: 'John Doe') 现在,如果有人也选中了“投票者”框,那么我会将搜索更改为: def results = IndividualRecord.fin

假设我们必须对一组数据库记录执行搜索,搜索条件由几个复选框和一个文本字段定义。因此,如果勾选了“美国公民”复选框,文本字段“姓名”将填入“John Doe”。然后,我在Grails应用程序中的搜索将类似于:

def results = IndividualRecord.findAllWhere(citizenship: 'US', name: 'John Doe')
现在,如果有人也选中了“投票者”框,那么我会将搜索更改为:

def results = IndividualRecord.findAllWhere(citizenship: US, name: 'John Doe', voter: true)
实际上,我的应用程序有几个文本字段和6个复选框。显然,我不能基于每个不同的条件组合编写自定义搜索函数,因为组合太多了。解决这个问题的有效方法是什么?因此,我认为理想情况下,应该有一个搜索函数,可以接受定制的查询参数并使用这些参数进行搜索。我有点迷茫和困惑。谢谢你的帮助

实际上,我的应用程序有几个文本字段和6个复选框。显然,我无法基于每个不同的条件组合编写自定义搜索函数,因为组合太多了

你真的不需要担心处理这些组合。如果可以将字段名和值作为映射接收,则只需将映射传递到
findAllWhere
,例如

def search(Map predicates) {
  IndividualRecord.findAllWhere(predicates)
}
如果出于某种原因您不喜欢这种方法,您可以使用条件查询,例如

def search(Map predicates) {

  IndividualRecord.withCriteria {

    if (predicates.voter != null) {
      eq 'voter', predicates.voter
    }

    if (predicates.citizenship) {
      eq 'citizenship', predicates.citizenship
    }

    if (predicates.name) {
      eq 'name', predicates.name
    } 
  }
}

使用标准有什么问题?谢谢,我以前没有使用标准,所以我不确定它是如何使用的,它是什么。这是很棒的指导。我试试看。