Grails搜索/过滤多个参数 - 控制器逻辑

时间:2014-05-28 05:42:30

标签: search grails filtering controllers

使用Grails(或hibernate),我想知道在实现域的搜索时是否应该使用特定的设计模式或方法。

例如,在我的网站上,我希望能够通过域中的多个属性进行过滤(或搜索)。

EG:因为我有一个显示酒店列表的页面。当我提交搜索表单时,或者如果用户点击"按名称过滤=' blah'",当我进入控制器时,我会得到以下内容:

Domain
  String name
  String location

Controller
  if(params.name && params.reference) {
      // Find name/reference
  } else if(params.name) {
      // Find name
  } else if(params.reference) {
      // Find reference
  } else {
      // Find all
  }

如您所知,如果域中有更多属性要搜索/过滤,控制器获取的时间就越长。

任何帮助。请注意,我不想使用可搜索的'插件,因为这对我的需求来说太复杂了。

1 个答案:

答案 0 :(得分:3)

我会将这些嵌入到Domain类本身的a named query中。例如:

Class Hotel {
  String name
  String city
  String country
  boolean isNice

  static namedQueries = {
    customSearch { p ->
      if (p?.name) eq('name', p.name)
      if (p?.city) eq('name', p.city)
      if (p?.country) eq('name', p.country)
      if (p?.isNice != null) eq('isNice', p.isNice)
    }
  }
}

然后在控制器的某个地方......

def results = Hotel.customSearch(params)

当然这是一个非常简单的示例,但您可以使用相同的命名查询进行扩展,甚至可以添加其他查询并将它们链接在一起。