JPAとSpring Data JPAによるクエリ結果の制限

データ]

1.はじめに

このチュートリアルでは、https://en.wikipedia.org/wiki/Java Persistence API[JPA]およびhttps://spring.io/projects/spring-data-jpa[ ]を使用して、 クエリ結果の制限について** 学習します。 Spring Data JPA]。

まず、クエリしたいテーブルと再現したいSQLクエリを見てみましょう。

それでは、JPAとSpring Data JPAを使用してそれを実現する方法について説明します。

始めましょう!

2.テストデータ

以下に、この記事全体を通して照会するテーブルを示します。

私たちが答えたいと思う質問は、「最初の居住席とは誰であり、誰がそれを占めているのか」です。

| ======================== | |名|姓|座席番号|ジル|スミス| 50 |イブ|ジャクソン| 94 |フレッド|ブログ| 22 |リッキー|ボビー| 36 |シヤ|コリシ| 85 | ========================= =========

3. SQL

SQLを使って、次のようなクエリを書くことができます。

SELECT firstName, lastName, seatNumber FROM passengers ORDER BY seatNumber LIMIT 1;

4. JPAの設定

JPAでは、テーブルをマッピングするために最初にEntityが必要です。

@Entity
class Passenger {

    @Id
    @GeneratedValue
    @Column(nullable = false)
    private Long id;

    @Basic(optional = false)
    @Column(nullable = false)
    private String fistName;

    @Basic(optional = false)
    @Column(nullable = false)
    private String lastName;

    @Basic(optional = false)
    @Column(nullable = false)
    private int seatNumber;

   //constructor, getters etc.
}

次に、 PassengerRepositoryImpl#findOrderedBySeatNumberLimitedTo(int limit) として実装されている、クエリコードをカプセル化するメソッドが必要です。

@Repository
class PassengerRepositoryImpl {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<Passenger> findOrderedBySeatNumberLimitedTo(int limit) {
        return entityManager.createQuery("SELECT p FROM Passenger p ORDER BY p.seatNumber",
          Passenger.class).setMaxResults(limit).getResultList();
    }
}

このリポジトリメソッドでは、https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html[ EntityManager ]を使用して Query ttps://docs.oracle.com/javaee/7/api/javax/persistence/Query.html#setMaxResults-int-[setMaxResults() )]__ 方法。

Query#setMaxResults へのこの呼び出しは、最終的に生成されたSQLに追加された制限ステートメントになります。

select
  passenger0__.id as id1__15__,
  passenger0__.fist__name as fist__nam2__15__,
  passenger0__.last__name as last__nam3__15__,
  passenger0__.seat__number as seat__num4__15__
from passenger passenger0__ order by passenger0__.seat__number limit ?

5. Spring Data JPAとは

Spring Data JPAを使ってSQLを生成することもできます。

メソッド名の派生は、キーワード first または__ top :のどちらでも使用できます。

interface PassengerRepository extends JpaRepository<Passenger, Long> {
    Passenger findFirstByOrderBySeatNumberAsc();
}

あるいはhttps://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html[ Pageable ]オブジェクトを使用することもできます。

Page<Passenger> page = repository.findAll(PageRequest.of(0, 1, Sort.by(Sort.Direction.ASC, "seatNumber")));

JpaRepository、 のデフォルトの実装を見てみましょう。 _https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/support/SimpleJpaRepository.html[SimpleJpaRepository]これも httpsを呼び出すことがわかります://docs.oracle.com/javaee/7/api/javax/persistence/Query.html#setMaxResults-int-[Query#setMaxResults]_ :

protected <S extends T > Page < S > readPage(TypedQuery < S > query,
  Class < S > domainClass, Pageable pageable,
  @Nullable Specification < S > spec) {
    if (pageable.isPaged()) {
        query.setFirstResult((int) pageable.getOffset());
        query.setMaxResults(pageable.getPageSize());
    }

    return PageableExecutionUtils.getPage(query.getResultList(), pageable, () -> {
        return executeCountQuery(this.getCountQuery(spec, domainClass));
    });
}

これらの選択肢の両方とも、私たちが追求しているSQLを生成します。

select
  passenger0__.id as id1__15__,
  passenger0__.fist__name as fist__nam2__15__,
  passenger0__.last__name as last__nam3__15__,
  passenger0__.seat__number as seat__num4__15__
from passenger passenger0__ order by passenger0__.seat__number asc limit ?

6.まとめ

https://en.wikipedia.org/wiki/Java Persistence API[JPA]でクエリ結果を制限することは、SQLとは少し異なります。https://en.wikipedia.org/wiki/Java Persistence Query__Languageに直接limitキーワードを含めません。[JPQL]

代わりに、https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/support/SimpleJpaRepository.html[ Query#に対して単一のメソッド呼び出しを行うだけです。 Spring Data JPA メソッド名にキーワード first または top__を含める。

いつものように、あなたはコードhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-jpa[over on GitHub]を見つけることができます。