【问题标题】:Generate Search SQL from HTTP GET request parameters从 HTTP GET 请求参数生成搜索 SQL
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!这听起来很有希望。我们将对此进行分析,看看是否可以使用它的一部分来适应我们的结构,因为我们想自己管理 REST 资源并且只需要查询功能。但如果这是可能的,那么我们只需要在消费者方面进行一些智能映射,从搜索表单到这些查询的结构。
    • 没有问题。自从我使用 Java 和/或 Hibernate 以来已经有很长时间了,我不确定这一切如何适合 hibernate。有趣的是,虽然我只是在 Matt Raible 的博客上 this post 关于对 AppFuse 的一些更改。在帖子中他提到了Hibernate Search,这让我想起了你的问题。也许你可以看看这是否对你的情况也有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多