私はSpring Dataリポジトリインタフェースで使用したいという名前のJPQLクエリを持っています。さらに、最初の結果だけを返すか、一致する結果がない場合はnullを返します。JPQL名前付きクエリを使用するSpringデータクエリメソッドのクエリ結果を制限できますか?
私が決定したことから、JPQLクエリ内の結果の数を制限する方法はありません。戻り値の型をエンティティクラスとして宣言することはできません。クエリによって複数の結果が返された場合は、IncorrectResultSizeDataAccessException
がスローされます。
first
またはtop
(詳細はSpring Data JPA docs)のキーワードを使用する通常の(JPQL以外の)クエリ方法については、名前付きクエリは、名前付きクエリの名前と一致するメソッド名を指定することでリポジトリインタフェースに含めることができます(やはりSpring Data JPA docsで詳しく説明されています)。しかし、私はこれらの2つを組み合わせる方法は見当たりません。リポジトリインタフェースで名前付きクエリの最初の結果を返すだけです。
は、ここで具体的な例である:
public interface ExampleRepository extends JpaRepository<Example, Integer> {
// Using "first" or "top" can return just the first value
Example findFirstByValueNotOrderByValueDesc(String value);
// Using the "Example.findMatchingComplicatedCriteria" named query to return all matching values
List<Example> findMatchingComplicatedCriteria(@Param("value") String value);
// TODO: How do I make something like this work?
// Example firstFindMatchingComplicatedCriteria(@Param("value") String value);
}
@Entity
@NamedQuery(name = "Example.findMatchingComplicatedCriteria",
query = "SELECT e from Example e WHERE e.value <> :value ORDER BY e.value DESC")
public class Example {
@Id public Integer id;
public String value;
}
私は直接のEntityManagerを使用することができることを承知していますが、私は可能であれば、リポジトリのインターフェイスからすべての直接これを実行したいと思います。もう1つの回避策は、リポジトリにリストを返させ、アプリケーションコードで最初の要素を取り除くことです。もう一度、私が避けることができるかどうか疑問に思う何か。私はまた、この機能を実現するためにネイティブクエリを使用できることに気付いています。
最終的に、私の質問は次のようなものです。Springデータリポジトリインタフェースメソッドで名前付きクエリを使用して単一の結果を返すことはできますか?それを禁止して、そこには問題が開いていますか?私は春のデータ問題追跡システムで何も見つかりませんでしたが、私の検索フが私に失敗するかもしれません。使用@Query(named="")
@Query(named="Example.findMatchingComplicatedCriteria")
List<Example> findFirstMatchingComplicatedCriteria(@Param("value") String value);
他の方法がある