Spring-Data-JPA をプロジェクトに組み込もうとしています。困惑していることの 1 つは、アノテーションによって setMaxResults(n) を実現するにはどうすればよいかということです。
たとえば私のコード:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOtherObj(OtherObj otherObj);
}
otherObj から Userを返すだけでよいのですone (and only one)
が、maxResults に注釈を付ける方法が見つかりません。誰かヒントをくれませんか?
(mysql は次のようにエラーを出力します:
com.mysql.jdbc.JDBC4PreparedStatement@5add5415: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED **
WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001
ERROR util.JDBCExceptionReporter - No value specified for parameter 2
)
リンクを見つけました:https://jira.springsource.org/browse/DATAJPA-147、試してみましたが失敗しました。今はできないようですね。なぜこのような重要な機能が Spring-Data に組み込まれていないのでしょうか?
この機能を手動で実装する場合:
public class UserRepositoryImpl implements UserRepository
に多数の定義済みメソッドを実装する必要があるのですがCrudRepository
、これはひどいことになります。
環境: spring-3.1、spring-data-jpa-1.0.3.RELEASE.jar、spring-data-commons-core-1.1.0.RELEASE.jar
ベストアンサー1
Spring Data JPA 1.7.0 (Evans リリース トレイン) 時点。
新しく導入されたキーワードTop
とFirst
キーワードを使用すると、次のようにクエリ メソッドを定義できます。
findTop10ByLastnameOrderByFirstnameAsc(String lastname);
Spring Dataは、結果を自動的に定義した数に制限します(省略した場合はデフォルトで1になります)。結果の順序はここで重要になります(OrderBy
例にあるように句を介して、またはメソッドにパラメータを渡すことによってSort
)。詳細については、ブログ記事をご覧ください。Spring Data Evans リリーストレインの新機能またはドキュメンテーション。
以前のバージョンの場合
データのスライスのみを取得するために、Spring Dataはページネーション抽象化を使用します。これは、Pageable
リクエスト側のインターフェースとPage
結果側の抽象化を備えています。つまり、次のように始めることができます。
public interface UserRepository extends Repository<User, Long> {
List<User> findByUsername(String username, Pageable pageable);
}
次のように使用します。
Pageable topTen = new PageRequest(0, 10);
List<User> result = repository.findByUsername("Matthews", topTen);
結果のコンテキスト(実際のページはどれですか?最初のページですか?全部でいくつありますか?)を知る必要がある場合は、Page
戻り値の型として以下を使用します。
public interface UserRepository extends Repository<User, Long> {
Page<User> findByUsername(String username, Pageable pageable);
}
クライアント コードは次のような処理を実行できます。
Pageable topTen = new PageRequest(0, 10);
Page<User> result = repository.findByUsername("Matthews", topTen);
Assert.assertThat(result.isFirstPage(), is(true));
戻り値の型として使用する場合、Page
メタデータを計算するために合計でいくつの要素があるかを調べる必要があるため、実際に実行されるクエリのカウント投影をトリガーするわけではありません。さらに、PageRequest
安定した結果を得るために、並べ替え情報を実際に装備していることを確認してください。そうしないと、クエリが 2 回トリガーされ、下にあるデータが変更されていなくても異なる結果が返される可能性があります。