در این مبحث خواهیم دید چگونه میتوان در JPA و Spring Data JPA تعداد نتایج دریافتی کوئری ها را محدود کنیم
محدود کردن تعداد نتایج در Native SQL :
SELECT firstName, lastName, seatNumber FROM passengers ORDER BY seatNumber LIMIT 1;
کلاس 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. }
حالا ما نیاز به متدی داریم که کوئری مورد نظر ما را پیاده سازی کند :
@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(); } }
متد ()setMaxResults تعداد نتایج را محدود میکنیم
کد بالا کوئری زیر را تولید میکند :
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 ?
استفاده از Spring Data JPA :
یکی از راه ها استفاده از کلمات کلیدی first و top است
Passenger findFirstByOrderBySeatNumberAsc(); Passenger findTopByOrderBySeatNumberAsc();
با این متد ها اولین رکورد دریافت خواهد شد در اینجا شماره اولین صندلی اشغال شده و اولین کسی که آنرا در اختیار گرفته را بر میگرداند
بهتر است با optional استفاده شود :
Optional<Passenger> findFirstByOrderBySeatNumberAsc(); Optional<Passenger> findTopByOrderBySeatNumberAsc();
استفاده از Pageable :
Page<Passenger> page = repository.findAll( PageRequest.of(0, 1, Sort.by(Sort.Direction.ASC, "seatNumber")));
هر دوی این روش ها کوئری زیر را تولید میکند و بسته به اینکه با کدامیک راحت تر هستید یا برای شما قابل استفاده است میتوانید از آن بهره ببرید :
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 ?