私は単純なRESTサービスで、SpringブートCrudRepository
を使用してデータにアクセスします。
このリポジトリは、すでに次のようなページネーションとソート機能を実装しています。
public interface FlightRepository extends CrudRepository<Flight, Long> {
List<Flight> findAll(Pageable pageable);
}
それを呼び出す:
Sort sort = new Sort(direction, ordering);
PageRequest page = new PageRequest(xoffset, xbase, sort);
return flightRepo.findAll(page);
このリポジトリにフィルタリングも追加したいと思います(たとえば、id > 13 AND id < 27
のエンティティのみを返します)。 CrudRepositoryはこの機能をサポートしていないようです。これを達成する方法はありますか、または別のアプローチを使用する必要がありますか?
ヒントをありがとう!
上記のコメントで、パラメーターのすべての組み合わせに対してクエリメソッドを作成する必要があるという懸念に対処する別の方法は、Criteria APIまたはQueryDSLを使用して仕様パターンを使用することです。
以下の懸念事項に対応して、両方のアプローチの概要を以下に示します。
大規模なアプリケーションでは、クエリメソッドの数が増加する可能性があります。これが2つ目のポイントです。クエリは固定された基準のセットを定義するためです。これらの2つの欠点を回避するために、動的に組み合わせてクエリを作成できる一連のアトミックな述語を考え出せたらすばらしいと思いませんか?
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
QueryDSLの方が扱いやすいと思います。 1つのインターフェースメソッドを定義するだけで、パラメーターの任意の組み合わせを述語として渡すことができます。
例えば.
public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> {
public List<User> findAll(Predicate predicate);
}
クエリするには:
repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M)));
repository.findAll(QUser.user.address.town.eq("Edinburgh"));
repository.findAll(QUser.user.foreName.eq("Jim"));
ここで、QUserはQueryDSL自動生成クラスです。
http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html
更新
Spring DataモジュールのGoslingリリースから、WebアプリケーションでHTTPパラメーターからの述語の自動生成がサポートされるようになりました。
https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support
リポジトリで以下の関数を宣言します[EDITED]
Page<Flight> findByIdBetween(Long start, Long end, Pageable pageable)
その後、リポジトリのインスタンスからこの関数を呼び出すことができます。詳細は spring-data reference を参照してください。