2つのパラメーターを取るスプリングデータリポジトリインターフェイスが必要です。次のような動作をさせる方法はありますか?
MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);
両方のパラメーターに値がある場合、通常どおりに動作し、両方の値に対して「AND」を実行したいと思います。
たとえば、2番目のパラメーターがnullの場合、ParameterOneのみで検索します
助言がありますか?
リポジトリメソッドの名前付けで可能かどうかはわかりませんが、@Query
好む
(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo)
現在、これはSpring-data-jpa
。
JIRA
によってまだinvestigationの下にあるSpring
ticket がありますチーム。
ただし、回避策が必要な場合は、 simple criteria query 例。
ここで欠けているソリューションの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> {}
これを試して、
@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);
私は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);
.