web-dev-qa-db-ja.com

Spring Data JPA-複数のANDおよびORメソッド名を組み合わせる方法

アプリケーションを移行しようとしています。 HibernateからSpring Data Jpaに取り組んでいます。

Spring data jpaはクエリ構築のための簡単なメソッドを提供しますが、Andと_Or operator_の両方を使用するクエリメソッドの作成にこだわっています。

MethodName-findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

クエリに変換すると、最初の2つの式が結合され、[(exp1 and exp2) or (exp3)]として実行されます。

一方、必須は](exp1) and (exp2 or exp3)]です。

_Spring data jpa?_を介してこれが達成可能かどうかを教えてください。

26

長くて読めないメソッド名についてはOliverに同意しますが、それでも引数のために、同値を使用することで望ましい結果を得ることができます

A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C)
A and (B or C) <=> (A and B) or (A and C)

したがって、あなたの場合、次のようになります。

findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)
21
Damir Djordjev

Option1:名前付きクエリを使用できます( JPA名前付きクエリの使用 を参照):

@Entity
@NamedQuery(name = "User.findByEmailAddress",
  query = "select u from User u where u.emailAddress = ?1")
public class User {

}

public interface UserRepository extends JpaRepository<User, Long> {

   User findByEmailAddress(String emailAddress);
}

Option2@Queryを使用してカスタムクエリを記述します( sing @Query

public interface UserRepository extends JpaRepository<User, Long> {

   @Query("select u from User u where u.emailAddress = ?1")
   User findByEmailAddress(String emailAddress);
}
9
fateddy

それは現在不可能であり、将来的にもありません。可能な場合でも、より複雑なクエリを使用して、すべてのクエリの複雑さを人為的にメソッド名に絞り込みたくないと主張します。クエリで実際に行われていることを消化するのが難しくなるだけでなく、クライアントコードの観点からも:表現力豊かなメソッド名を使用したい場合—単純なfindByUsername(…)の場合—クエリ派生により作成できます。

より複雑なものについては、クエリの複雑さを呼び出しコードに上げるだけで、クエリの動作を意味的に表す読み取り可能なメソッド名に移動し、@Queryを使用して手動で宣言されたクエリでクエリの複雑さを維持することをお勧めします名前付きクエリなど。

8
Oliver Drotbohm

のようなものを使用してください

findByFirstElementAndCriteriaOrSecondElementAndCriteria

のような(最初と条件)OR(2番目と条件)->条件&(最初または2番目)

6
leonardo rey