我们有一个 Java 网络应用程序,它具有提供 REST 资源的 hibernate 后端。现在我们面临的任务是实现一个由我们的 get 请求中的查询参数控制的通用搜索:
some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something
或类似的。
是否有某种框架可以帮助将 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/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option