タイトルのとおり。
私は基本的に次のようなリクエストをしたいと思います
/api/todos/?completed=eq.true&created_at=lt.1486462109399
準備ができていますかspring way
そのようなことを達成するのですか? Page/Pageableメカニズムに似たものがあれば素晴らしいでしょう。
ない場合は、Hibernate Criteria Queries&Argument Re-solversを使用して実装できると思います。基本的に次のようにコントローラーを書くことができます
@GetMapping
public ResponseEntity<Page<TodoDTO>> listAll(Criteria criteria, Pageable pageable)
{
Page<Todo> todos = todoService.listAll(criteria, pageable)
...
}
カスタム引数リゾルバは、クエリ文字列を基準に変換する責任があります。サービス内でどのように処理するかはまだよくわかりませんが、それを実装しようとする方向です。
それは良いアプローチでしょうか?推奨事項はありますか? (すべて、すでにそのような準備ができているメカニズムがないと仮定しています)。
あなたの助けは大歓迎です。
Fluent Query APIを構築する別のオプションは、RSQLパーサーを使用することです。 [〜#〜] rsql [〜#〜] は、RESTful APIのエントリのパラメータ化されたフィルタリングのためのクエリ言語です。 この記事 に従ってください。APIは次のようなURLを処理できます。
http://localhost:8080/users?search=firstName==jo*;age<25
サンプルコントローラー:
@RestController
@RequestMapping(value = "/users")
public class UserController {
@Autowired
private UserRepository repo;
@GetMapping
public List<User> findAllByRsql(@RequestParam(value = "search") String search) {
Node rootNode = new RSQLParser().parse(search);
Specification<User> spec = rootNode.accept(new CustomRsqlVisitor<User>());
return repo.findAll(spec);
}
}
Search/Filter REST Spring Data JPAと仕様を使用したAPI を構築できます。結果の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);
}
}