در این مبحث خواهیم دید چگونه میتوان در 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 ?