web-dev-qa-db-ja.com

Springを使用して安らかな方法でデータをフィルタリングするにはどうすればよいですか?

タイトルのとおり。

私は基本的に次のようなリクエストをしたいと思います

/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)
        ...
 }

カスタム引数リゾルバは、クエリ文字列を基準に変換する責任があります。サービス内でどのように処理するかはまだよくわかりませんが、それを実装しようとする方向です。

それは良いアプローチでしょうか?推奨事項はありますか? (すべて、すでにそのような準備ができているメカニズムがないと仮定しています)。

あなたの助けは大歓迎です。

13
Dawid

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);
    }

}
5
naXa

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);
    }
}
5
naXa