考虑在Spring MVC之上的应用程序,它显示表中模型列表的字段。您可以根据某些条件筛选表行。以下是一个示例屏幕截图(摘自Redmine问题跟踪系统,但对其余讨论并不重要):
现在,请注意所有过滤器都是可选的:我可以在搜索中自由包含/不包含每个过滤器。 MVC控制器的工作是检测请求中是否存在过滤器,并返回正确的模型(与ORM解决方案一起使用,在我的例子中是Hibernate)。
相当繁琐的过程是控制器使用switch-case / if-else结构来检测请求中是否存在过滤器。
有更好的解决方案吗?例如,有没有办法让控制器接受一些对象,其中Spring(通过适当的配置)将请求映射到该对象的字段,然后控制器可以正确地将此对象传递给Hibernate以获取模型列表?
为简单起见,请假设我们要过滤“问题”表(如上图所示),“问题”模型是以下POJO:
// for simplicity, annotations are removed
public class Issue {
long id;
Boolean status;
float done;
long author_Id; // foreign key
//getters and setters
...
}
答案 0 :(得分:1)
所以,是的,正如评论中所述,这绝对是一个更好的解决方案。
使用当前的状态技术(java8,spring 4.1 +,标准api),您可以在Controller中使用Java的Optional - Container。使用isPresent,您可以传递这样的参数:
public void getResults(@RequestParam("filter") Optional<String> filter) {
...
// or call a method only if filter is present:
filter.ifPresent(value -> item.setFilter(value));
//or a similar call via method reference
//filter.ifPresent(this::setFilter);
...
}
要让where
- 子句使用动态过滤值,我建议使用Criteria - API