Grails 2.3.7 Rest API - 搜索/查询

标签 grails grails-orm grails-plugin grails-controller

我正在使用 Grails 2.3.7。我通过覆盖 restfull Controller 接口(interface)将我的 Controller 公开为 REST Controller 。我的客户是 AngularJS。我的 CRUD 操作运行良好。我现在需要在各种对象上编写搜索 API,例如在帐户名称和号码上搜索或在客户电子邮件上搜索客户对象。

编写此类搜索 API 的有效且最佳方法应该是什么?我可以为每个搜索条件编写一个 API,但寻找可以将搜索条件作为 JSON 发布并应用于相应资源对象的通用内容。有没有这样的通用方法来实现这个?

周杰伦

最佳答案

我认为这里的问题是搜索 是一个相当大的领域。

如果您需要真正的搜索功能,您一定要看看第三方搜索服务器,例如 solrelasticsearch以及相应的 Grails 插件。这些产品根据您的数据创建单独的索引,并提供分面搜索、查询输入的拼写建议、结果突出显示等功能(并且具有高度可扩展性)。

但是,既然您提到您不想使用第三方库,您可能正在寻找更简单的东西。

您的问题的一个非常基本的解决方案可能是这样的:

class CustomerController extends RestfulController {

  ...

  def search(String property, String value) {
    respond Customer.createCriteria().list {
      like property, "%$value%"
    }
  }
}

这会创建一个 Gorm criteria query查询具有匹配 SQL like 字段的 Customer 对象条件。

使用像这样的 url 调用此操作

/customer/search?property=lastname&value=foo

将返回所有 lastname 包含 foo 的客户。

通过为域类使用附加参数,您可以轻松地使此操作更通用:

def searchWithClass(String className, String property, String value) {
  def domainClass = grailsApplication.getDomainClass(className).clazz
  respond domainClass.createCriteria().list {
    like property, "%$value%"
  }
}

现在您可以使用className 参数传递您要查询的域类:

.../searchWithClass?property=lastname&value=foo&className=foo.bar.Customer

但是在使用这样的方法时要记住一些事情:

  • SQL like 查询的性能可能不是最好的(尤其是当您有非常大的文本字段时)
  • 您只能使用这种方式查询字符串字段。对于数字或日期等其他数据类型,您需要不同的解决方案
  • 确保验证并限制搜索参数。否则,可以查询您应用程序中的每个域类。

关于Grails 2.3.7 Rest API - 搜索/查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22767092/

相关文章:

grails - 测试调用其他标签库的 Grails 标签库

java - 在运行时获取安装的依赖版本

grails - 在Grails中进行多个动态方法调用或声明变量

grails - 有没有更简单的方法可以在Grails中进行内容协商的响应?

mongodb - 我们可以在 findAll 中给出多个东西吗

hibernate - Grails 单个类的多个数据库使用

Grails gorm : queries with map

Hibernate 事务边界

grails - Grails中的媒体服务器插件

database - Grails 数据库迁移插件