Spring-Data-JPA アノテーションの setMaxResults? 質問する

Spring-Data-JPA アノテーションの setMaxResults? 質問する

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 リリース トレイン) 時点。

新しく導入されたキーワードTopFirstキーワードを使用すると、次のようにクエリ メソッドを定義できます。

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 回トリガーされ、下にあるデータが変更されていなくても異なる結果が返される可能性があります。

おすすめ記事