6

我们有一个带有提供 REST 资源的休眠后端的 Java Web 应用程序。现在我们面临的任务是实现由 get 请求中的查询参数控制的通用搜索:

some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something

或类似的。

  • 我们不想预定义所有可能的参数(名称、created_on、something)
  • 我们不想分析请求字符串来获取控制字符(如 >=)
  • 我们也不想实现我们自己的语法来反映诸如 _eq _like _goe 之类的东西(作为控制字符的替代或补充)

是否有某种框架可以提供从 GET 请求参数到数据库查询的映射的帮助?

因为我们知道我们正在获取哪个 REST 资源,所以我们有实体/表(选择)。可能还需要预定义将执行的 JOIN 以限制搜索的深度。

但除此之外,我们希望使用 REST 的客户端能够执行任何搜索,而无需我们预先定义某个参数和某个控制序列将如何转换为搜索。


现在我正在尝试在 Mysemas QueryDSL 上构建一些半自动解决方案。它允许我预定义 where 列和排序列,并且我正在进行简单的字符串比较以检测参数中的“_like”、“_loe”等内容,然后激活搜索的相应预定义部分。与 SQL 字符串没有太大区别,只是它是 SQL 注入证明和类型保存。

但是,我仍然必须告诉我的搜索对象,它应该能够潜在地处理一个查询“寻找一个名字像'???'的人”。现在这没问题,因为我们只在内部使用 REST 资源并很好地隔离了实际的搜索创建。如果我们需要做更多的搜索,我们现在可以添加更多的预定义。但是我们是否应该在未来的某个时间公开我们的 REST 资源,那将不会那么好。


所以我们想知道,必须有一些框架或最佳实践或推荐的解决方案来解决这个问题。我们不是第一个想要这个的人。例如,Redmine 通过 REST 接口提供其所有资源,我可以随意查询。或者 facebook 及其 Graph API。我敢肯定,这些人不仅预先定义了所有可能性,而且还创建了一些通用语法。我们希望尽可能多地节省这项工作,并改用可用的解决方案。

就像我说的那样,我们使用的是 Hibernate,因此 SQL 或 HQL 解决方案或任何构建在 QueryDsl 等实体上的解决方案都可以。(还有关于 SQL 注入的安全问题)

有什么建议么?想法?我们只需要自己做这一切吗?

4

1 回答 1

1

从 .NET 的角度来看,我能想到的最接近的东西是 WCF 数据服务。

查看OData 网站上指定的 uri-conventions 。关于4.5 Filter System Query Option部分有一些很好的信息。您会注意到此站点上的许多示例都与 .NET 相关,但还有其他 建议可以让这些示例与 Java 一起使用。

于 2012-09-25T15:08:07.067 回答