web-dev-qa-db-ja.com

Spring Data-null値がある場合、パラメーターを無視します

2つのパラメーターを取るスプリングデータリポジトリインターフェイスが必要です。次のような動作をさせる方法はありますか?

MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);

両方のパラメーターに値がある場合、通常どおりに動作し、両方の値に対して「AND」を実行したいと思います。

たとえば、2番目のパラメーターがnullの場合、ParameterOneのみで検索します

助言がありますか?

24
Panos

リポジトリメソッドの名前付けで可能かどうかはわかりませんが、@Query 好む

(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo)
23
Kadzhaev Marat

現在、これはSpring-data-jpa

JIRAによってまだinvestigationの下にあるSpringticket がありますチーム。

enter image description here

ただし、回避策が必要な場合は、 simple criteria query 例。

10
Abdullah Khan

ここで欠けているソリューションの1つは、Spring Data JPAの 例によるクエリ 機能であり、 ExampleMatcher#ignoreNullValues 。これは、この問題を解決するために正確に構築されています。カスタムクエリとクエリビルダーはnot必要です。

このSpring Dataクエリ:

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", null), matcher);
List<MyObject> results = repository.findAll(exampleQuery);

次のようなクエリを生成します。

select * 
from myObject 
where parameter1 = "foo"

次の場合:

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", "bar"), matcher);
List<MyObject> results = repository.findAll(exampleQuery);

利回り:

select * 
from myObject 
where parameter1 = "foo"
and parameter2 = "bar"

とてもかっこいい!

Repositoryインターフェースに対してしなければならないことの1つは、QueryByExampleインターフェースを追加することです。これを行うには、QueryByExampleインターフェイスを直接拡張するか、JpaRepositoryを介して暗黙的に拡張します。

public interface MyObjectRepository extends JpaRepository<MyObject, Long> {}
5
Dovmo

これを試して、

      @Query(value = "SELECT pr FROM ABCTable pr " +
        "WHERE((pr.parameterOne = :parameterOne) or (pr.parameterOne = null and :parameterOne = null)) and 
        ((pr.parameterTwo = :parameterTwo) or (pr.parameterTwo = null and :parameterTwo = null)) ")
      List<PaymentRequest> getSomething (@Param("parameterOne") String parameterOne,
                                             @Param("parameterTwo") String parameterTwo);
0
Sana

私はSpring/JPAスペースで新しいです、

「Query By Example」を使用します

私は(seviceImpで)使用しています、以下の引数はすべてオプションです/ユーザーの選択に依存します

`
  .
    if (!firstName.isEmpty() ) {
    staff.setFirstName(firstName);
    }



    if (!lastName.isEmpty() ) {
    staff.setLastName(lastName);
    }

    if (!ptAadhar.isEmpty() ) {
        patient.setPtAadhar(ptAadhar);
    }

    if (!Cell.isEmpty() ) {
        staff.setCell(Cell);
    }


      Example<StaffEntity> example = Example.of(staff);  

      List<StaffEntity> staffList =staffRepository.findAll(example);
       .
0
M Singh