4

プロジェクトで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>

ありがとう。

4

0 に答える 0