从HTTP GET请求参数生成搜索SQL

Pet*_*ete 6 java sql rest hibernate hql

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

some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something
Run Code Online (Sandbox Code Playgroud)

或类似的.

  • 我们不想预定义所有可能的参数(name,created_on,something)
  • 我们不想分析请求String来获取控制字符(比如> =)
  • 我们也不想实现自己的语法来反映_eq _like _goe等等(作为控制字符的替代或补充)

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

由于我们知道我们正在获取哪个REST资源,因此我们有实体/表(select).可能还需要预先定义将要执行的JOIN以限制搜索的深度.

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


现在我正在尝试在Mysemas QueryDSL上构建一些半自动解决方案.它允许我预定义列和排序列的位置,我正在进行简单的字符串比较,以检测参数中的'_like','_ loe',...等内容,然后激活相应的预定义搜索部分.与SQL字符串没什么不同,只是它的SQL注入证明类型保存.

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


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

就像我说的,我们正在使用Hibernate,因此SQL或HQL解决方案可以很好,或者像QueryDsl这样的实体构建.(还有关于SQL注入的安全问题)

有什么建议?想法?我们自己必须自己做吗?

Mr *_*ose 1

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

查看OData 网站上指定的uri 约定。4.5 过滤系统查询选项部分有一些很好的信息。您会注意到,该站点上的许多示例都与 .NET 相关,但还有其他 建议可以使其与 Java 一起使用。