正如标题所说。
我基本上会喜欢做像
这样的请求/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)
...
}
自定义参数解析器将负责将查询字符串转换为条件。我不太确定如何在服务中处理它,但这是我尝试实现它的方向。
这会是一个好方法吗?有什么建议? (所有假设已经没有现成的机制)。
非常感谢您的帮助。
答案 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