如何使用Spring以一种安静的方式过滤数据?

时间:2017-02-07 10:50:30

标签: java spring hibernate rest filter

正如标题所说。

我基本上会喜欢做像

这样的请求
/api/todos/?completed=eq.true&created_at=lt.1486462109399

是否已准备好spring way实现此类目标?类似于Page / Pageable机制的东西会很棒。

如果没有,我认为我可以使用Hibernate Criteria Queries& amp;参数重新求解器。基本上允许我编写我的控制器,如

 @GetMapping
 public ResponseEntity<Page<TodoDTO>> listAll(Criteria criteria, Pageable pageable) 
 {
        Page<Todo> todos = todoService.listAll(criteria, pageable)
        ...
 }

自定义参数解析器将负责将查询字符串转换为条件。我不太确定如何在服务中处理它,但这是我尝试实现它的方向。

这会是一个好方法吗?有什么建议? (所有假设已经没有现成的机制)。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您可以构建Search/Filter REST API using Spring Data JPA and Specifications。 以下是生成的API能够处理的测试URL示例:

http://localhost:8080/users?search=lastName:doe,age>25

和示例控制器:

@RestController
@RequestMapping(value = "/users")
public class UserController {

    @Autowired
    private UserRepository repo;

    @GetMapping
    public List<User> search(@RequestParam(value = "search") String search) {
        UserSpecificationsBuilder builder = new UserSpecificationsBuilder();
        Pattern pattern = Pattern.compile("(\w+?)(:|<|>)(\w+?),");
        Matcher matcher = pattern.matcher(search + ",");
        while (matcher.find()) {
            builder.with(matcher.group(1), matcher.group(2), matcher.group(3));
        }

        Specification<User> spec = builder.build();
        return repo.findAll(spec);
    }
}

答案 1 :(得分:3)

构建流畅查询API的另一个选择是使用RSQL解析器。 RSQL是一种用于RESTful API中条目的参数化过滤的查询语言。关注this article,您的API就可以处理以下网址:

$valueArray = array();
foreach ( $cars as $value ) {
    $valueArray[] = array_filter($value);
}
echo '<pre>'; print_r($valueArray);

样本控制器:

http://localhost:8080/users?search=firstName==jo*;age<25