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

标签 java sql hibernate rest hql

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

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

或类似的。

  • 我们不想预定义所有可能的参数(name、created_on、 某事)
  • 我们不想分析请求字符串来获取控制字符(如 >=)
  • 我们也不想实现自己的语法来反射(reflect)诸如 _eq _like _goe 等内容(作为控制字符的替代或补充)

是否有某种框架可以帮助将 GET 请求参数映射到数据库查询

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

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


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

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


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

正如我所说,我们正在使用 Hibernate,因此 SQL 或 HQL 解决方案或任何构建在 QueryDsl 等实体之上的解决方案都可以。 (还有SQL注入(inject)的安全问题)

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

最佳答案

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

看看the uri-conventions在 OData 网站上指定。关于 4.5 Filter System Query Option 的部分有一些很好的信息.您会注意到该站点上的许多示例都与 .NET 相关,但有 other suggestions为了让它与 Java 一起工作。

关于java - 从 HTTP GET 请求参数生成搜索 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12579611/

相关文章:

java - 如何检测 INDEX.LIST 是否被 Web Start 使用?

java - jetty嵌入jsp问题

java - 在 Java 中嵌入 Groovy(绑定(bind))

postgresql - 使用 PostgreSQL 9.5 进行 JPA 模式验证

java - 如何从项目列表中检索选定的项目?

java - CompositeConfiguration - 具有相同名称的属性

sql - 按多列分组并限制每组 - Postgres

mysql - 如何删除所有以某个前缀开头的MySQL表?

mysql - MySQL中按聚合函数max分组

java - 为什么我不能重写和注释实体映射的 getter 方法?