web-dev-qa-db-ja.com

Spring Data Repositoryで使用される@Queryの結果を制限する方法

Spring Data JPACrudRepositoryでデータを取得しています。 _@Query_アノテーションで提供されるカスタムクエリから取得したレコードをフィルター処理したい。 _select rows.._に対して.setMaxResults(20);を試しましたが、エラーが発生します。テーブルの最初の20行をフィルタリングしたい

これは私のリポジトリです

_package lk.slsi.repository;

import Java.util.Date;
import lk.slsi.domain.SLSNotification;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import Java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

/**
 * Created by ignotus on 2/10/2017.
 */
public interface SLSNotificationRepository extends CrudRepository<SLSNotification, Integer> {


    @Override
    SLSNotification save(SLSNotification slsNotification);

    @Override
    SLSNotification findOne(Integer snumber);

    @Override
    long count();

    @Override
    void delete(Integer integer);

    @Override
    void delete(SLSNotification slsNotification);

    @Override
    void delete(Iterable<? extends SLSNotification> iterable);

    @Override
    List<SLSNotification> findAll();

    @Query("select a from SLSNotification a where a.slsiUnit in :unitList order by snumber desc")
    List<SLSNotification> getApplicationsByUnit(@Param("unitList") List<String> unitList);

    @Query("select a from SLSNotification a where a.userId = :userId")
    List<SLSNotification> getApplicationsByUserId(@Param("userId") String userId);

    @Query("select a.snumber, a.date, a.slsNo, a.slsiUnit, a.productDesc, a.status from SLSNotification a where a.userId = :userId ORDER BY snumber desc")
    List<SLSNotification> getApplicationsByUserIdforManage(@Param("userId") String userId);

    @Query("select a from SLSNotification a where a.slsNo = :slsNo")
    SLSNotification getApplicationBySLSNumber(@Param("slsNo") String slsNo);

}
_

List<SLSNotification> getApplicationsByUserIdforManage(@Param("userId") String userId);メソッドを使用して、限られたデータセットを取得します。これを行うには、どうすればエンティティマネージャまたは何かを呼び出すことができますか?

これを手伝ってください。 output img

9

SQLのlimitstatementによって制限を提供できます。また、nativeQuery = trueアノテーションに@Queryを追加して、JPAプロバイダー(Hibernateなど)がnative SQLクエリと見なすように設定します。

@Query(nativeQuery = true, value = "SELECT * FROM SLSNotification s WHERE s.userId = :userId ORDER BY snumber DESC LIMIT 20")
List<SLSNotification> getUserIdforManage(@Param("userId") String userId);

または

さらに、Spring Data JPAの便利な機能を利用したい場合は、適切なメソッドの名前を付けることで実行できます

List<SLSNotification> findByUserIdOrderBySNumber(@Param("userId") String userId, Pageable pageable);

まだわからない場合は、Spring Data JPAがメソッド名からQueryを構築します。すごいでしょ?よりよく理解するために、これを読んでください ドキュメント

次のようにこのメソッドを呼び出すだけです

Pageable topTwenty = PageRequest.of(0, 20);
List<SLSNotification> notifications = repository.findByUserIdOrderBySNumber("101", topTwenty);

また、Java 8を使用している場合

インターフェイスにdefaultメソッドを含めるオプションがあり、人生を少し楽にする

 List<SLSNotification> findByUserIdOrderBySNumber(@Param("userId") String userId, Pageable pageable);

 default List<User> findTop20ByUserIdOrderBySNumber(String userId) {
    return findByUserIdOrderBySNumber(userId, PageRequest.of(0,20));
 }
18
Shafin Mahmud