プロジェクトでSpring Data JPAを使用しています。次のEntity Bean「TABLE」があります。独自のリポジトリを作成しました
TableRepository extends JpaRepository<Table, Long>, JpaSpecificationExecutor<TABLE>.
また、フィルタリングされたデータを選択する仕様を作成しました。選択する必要がある項目を含む Bean があり、それらを.in()述語の 1 つのリストにグループ化します (「SELECT * FROM WHERE ID in(...) AND VALUE in(...) AND VALUE2 in(.. .) ... ")
public static Specification<Table> filteredListOfValues(final FilterRequestsParametersBean filterRequestsParametersBean) {
return new Specification<Table>() {
public Predicate toPredicate(Root<Table> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> listOfPredicates = createListOfPredicates(root, filterRequestsParametersBean);
return criteriaBuilder.and(listOfPredicates.toArray(new Predicate[listOfPredicates.size()]));
}
};
}
その後、TableRepositoryおよびPageableパラメータを持つfindAll()アイテムを見つけます。
this.getTableRepository().findAll(where(filteredListOfValues(filterRequestsParametersBean)), pageable);
テーブルビュー:
id, value, etc..
1, 1, ...
2, 1, ...
3, 2, ...
4, 2, ...
5, 3, ...
6, 5, ...
そして質問。Pageable を使用して、TABLEのフィールドVALUEとは異なるすべての値を選択するにはどうすればよいですか。
もちろん HashMap は使えますが、Spring Data JPA の Pageable の機能はありません。並べ替えとページングが必要です。
次のように、1 つのフィールド値に対して仕様を使用することもできます。
public static Specification<Long> filteredListOfValues(final FilterRequestsParametersBean filterRequestsParametersBean) {
return new Specification<Long>() {
public Predicate toPredicate(Root<Long> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
....//somethind like that
criteriaQuery.select(root.<Long> get("value")).distinct(true);
....
List<Predicate> listOfPredicates = createListOfPredicates(root, filterRequestsParametersBean);
return criteriaBuilder.and(listOfPredicates.toArray(new Predicate[listOfPredicates.size()]));
}
};
}
ただし、その場合、リポジトリ TableRepository のメソッド findAll() は、次のような指定のみを受け入れることができます: JpaSpecificationExecutor<Table>
、ではありませんJpaSpecificationExecutor<Long>
ありがとう。