【发布时间】:2012-09-16 18:33:44
【问题描述】:
我们有一个带有休眠后端的 Java Web 应用程序,它提供 REST 资源。现在我们面临的任务是实现由 get 请求中的查询参数控制的通用搜索:
some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something
或类似的。
- 我们不想预定义所有可能的参数(名称、created_on、 东西)
- 我们不想分析请求字符串来获取控制字符(如 >=)
- 我们也不想实现我们自己的语法来反映诸如 _eq _like _goe 之类的东西(作为控制字符的替代或补充)
是否有某种类型的框架可以为这种从 GET 请求参数到数据库查询的映射提供帮助?
由于我们知道要获取的 REST 资源,因此我们拥有实体/表(选择)。可能还需要预定义将要执行的 JOIN 以限制搜索的深度。
但除此之外,我们希望 REST 消费客户端能够执行任何搜索,而无需我们预先定义某个参数和某个控制序列将如何转换为搜索。
现在我正在尝试一些基于 Mysemas QueryDSL 的半自动解决方案。它允许我预定义 where 列和排序列,并且我正在进行简单的字符串比较以检测参数中的“_like”、“_loe”等内容,然后激活搜索的相应预定义部分。与 SQL 字符串没有太大区别,只是它是 SQL 注入证明和类型保存。
但是我仍然必须告诉我的搜索对象,它应该能够潜在地处理一个查询“寻找一个名字像 '???' 的人”。现在这没关系,因为我们只在内部使用 REST 资源并很好地隔离了实际的搜索创建。如果我们需要做更多的搜索,我们现在可以添加更多的预定义。但是我们是否应该在未来的某个时间公开我们的 REST 资源,那将不会那么好。
所以我们想知道,必须有一些框架或最佳实践或推荐的解决方案来解决这个问题。我们不是第一个想要这个的人。例如,Redmine 通过 REST 接口提供其所有资源,我可以随意查询。或者带有 Graph API 的 facebook。我敢肯定,这些人不仅预先定义了所有可能性,而且还创建了一些通用语法。我们希望尽可能多地节省这方面的工作量并改用可用的解决方案。
就像我说的那样,我们使用的是 Hibernate,因此 SQL 或 HQL 解决方案或任何构建在 QueryDsl 等实体上的解决方案都可以。 (还有关于SQL注入的安全问题)
有什么建议吗?想法?我们是否只需要自己做这一切?
【问题讨论】:
标签: java sql hibernate rest hql