web-dev-qa-db-ja.com

Spring Data JPAの仕様を初期化する方法は?

フィルターを使用して検索を行うメソッドがあるので、動的クエリを作成するために Specification を使用しています。

public Page<Foo> searchFoo(@NotNull Foo probe, @NotNull Pageable pageable) {

        Specification<Foo> spec = Specification.where(null);  // is this ok?

        if(probe.getName() != null) {
            spec.and(FooSpecs.containsName(probe.getName()));
        }
        if(probe.getState() != null) {
            spec.and(FooSpecs.hasState(probe.getState()));
        }
        //and so on...

        return fooRepo.findAll(spec, pageable);
}

フィルターが指定されていない可能性があるため、フィルターなしですべてをリストします。それを念頭に置いて、specを初期化する方法を教えてください。現時点では、上記のコードは機能しません。常に同じ結果が返されます。テーブルのすべてのレジスター、フィルタリングは適用されていませんが、and操作が行われています。

FooSpecs:

public class PrescriptionSpecs {

    public static Specification<Prescription> containsCode(String code) {
        return (root, criteriaQuery, criteriaBuilder) ->
            criteriaBuilder.like(root.get(Prescription_.code), "%" + code + "%");
    }

    // some methods matching objects...
    public static Specification<Prescription> hasContractor(Contractor contractor) {
        return (root, criteriaQuery, criteriaBuilder) ->
            criteriaBuilder.equal(root.get(Prescription_.contractor), contractor);
    }
    //... also some methods that access nested objects, not sure about this
    public static Specification<Prescription> containsUserCode(String userCode) {
        return (root, criteriaQuery, criteriaBuilder) ->
            criteriaBuilder.like(root.get(Prescription_.user).get(User_.code), "%" + userCode + "%");
    }
}
12
anat0lius

Specification.where(null)は問題なく動作します。 @Nullableと実装は、必要に応じてnull値を処理します。

問題は、andを変更するかのようにSpecificationメソッドを使用しているが、新しいメソッドを作成することです。だからあなたは使うべきです

spec = spec.and( ... );
14
Jens Schauder