リポジトリレイヤーにいくつかのクエリメソッドを記述したいと思います。このメソッドは、nullパラメーターを無視する必要があります。例えば:
List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam);
このメソッドは、次の条件によってFooを返す必要があります。
bar == barParam && goo == gooParam;
gooParamがnullでない場合。 gooParamがnullの場合、条件は次のように変更されます。
bar == barParam;
解決策はありますか?誰かが私を助けることができますか?
答えるのが遅すぎます。 BarとGooの関係についてはわかりません。 例が役立つかどうかを確認します。
それは私のために働いた。同様の状況があり、エンティティser属性のセットがあり、属性に基づいてユーザーを検索するfindAllメソッドがあります(オプション)。
例、
Class User{
String firstName;
String lastName;
String id;
}
Class UserService{
// All are optional
List<User> findBy(String firstName, String lastName, String id){
User u = new User();
u.setFirstName(firstName);
u.setLastName(lastName);
u.setId(id);
userRepository.findAll(Example.of(user));
// userRepository is a JpaRepository class
}
}
クエリ定義にメソッド名アプローチを使用してそれを行うことができるとは思わない。ドキュメントから( reference ):
メソッド名から派生したクエリを取得することは非常に便利ですが、使用したいキーワードをメソッド名パーサーがサポートしていないか、メソッド名が不必要にarilyくなる状況に直面する可能性があります。したがって、命名規則(詳細については、JPA NamedQueriesの使用を参照)を介してJPA名前付きクエリを使用するか、クエリメソッドに@Queryで注釈を付けることができます。
ここにそのような状況があると思うので、以下の答えは@Queryアノテーションアプローチを使用します。これはメソッド名アプローチ( reference )。
@Query("select foo from Foo foo where foo.bar = :bar and "
+ "(:goo is null or foo.goo = :goo)")
public List<Foo> findByBarAndOptionalGoo(
@Param("bar") Bar bar,
@Param("goo") Goo goo);
@chaserbの答えを補完するものとして、私は個人的にパラメーターをJava8 Optional型として追加し、オプションのフィルターであるセマンティクスをメソッドの署名で明示的にします。
@Query("select foo from Foo foo where foo.bar = :bar and "
+ "(:goo is null or foo.goo = :goo)")
public List<Foo> findByBarAndOptionalGoo(
@Param("bar") Bar bar,
@Param("goo") Optional<Goo> goo);
ほんの数行でこれを自分でコーディングできます。
List<Foo> findByBarAndOptionalGoo(Bar bar, Goo goo) {
return (goo == null) ? this.findByBar(bar) : this.findByBarAndGoo(bar, goo);
}
それ以外の場合、Spring-Dataがこれをすぐにサポートするかどうかはわかりません。