How to limit query results (#5616)
* JPA/Hibernate * Spring Data JPA BAEL-2208
This commit is contained in:
parent
78dd662f70
commit
edbc683094
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.limit;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
interface CustomPassengerRepository {
|
||||||
|
|
||||||
|
List<Passenger> findOrderedBySeatNumberLimitedTo(int limit);
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
package com.baeldung.limit;
|
||||||
|
|
||||||
|
import javax.persistence.Basic;
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@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;
|
||||||
|
|
||||||
|
private Passenger(String fistName, String lastName, int seatNumber) {
|
||||||
|
this.fistName = fistName;
|
||||||
|
this.lastName = lastName;
|
||||||
|
this.seatNumber = seatNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Passenger from(String firstName, String lastName, int seatNumber) {
|
||||||
|
return new Passenger(firstName, lastName, seatNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object object) {
|
||||||
|
if (this == object)
|
||||||
|
return true;
|
||||||
|
if (object == null || getClass() != object.getClass())
|
||||||
|
return false;
|
||||||
|
Passenger passenger = (Passenger) object;
|
||||||
|
return getSeatNumber() == passenger.getSeatNumber() && Objects.equals(getFistName(), passenger.getFistName())
|
||||||
|
&& Objects.equals(getLastName(), passenger.getLastName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(getFistName(), getLastName(), getSeatNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
final StringBuilder toStringBuilder = new StringBuilder(getClass().getSimpleName());
|
||||||
|
toStringBuilder.append("{ id=").append(id);
|
||||||
|
toStringBuilder.append(", fistName='").append(fistName).append('\'');
|
||||||
|
toStringBuilder.append(", lastName='").append(lastName).append('\'');
|
||||||
|
toStringBuilder.append(", seatNumber=").append(seatNumber);
|
||||||
|
toStringBuilder.append('}');
|
||||||
|
return toStringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getFistName() {
|
||||||
|
return fistName;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getSeatNumber() {
|
||||||
|
return seatNumber;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.limit;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
interface PassengerRepository extends JpaRepository<Passenger, Long>, CustomPassengerRepository {
|
||||||
|
|
||||||
|
Passenger findFirstByOrderBySeatNumberAsc();
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.baeldung.limit;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.PersistenceContext;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
class PassengerRepositoryImpl implements CustomPassengerRepository {
|
||||||
|
|
||||||
|
@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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package com.baeldung.limit;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.domain.Sort;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.PersistenceContext;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
@DataJpaTest
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
public class LimitIntegrationTest {
|
||||||
|
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager entityManager;
|
||||||
|
@Autowired
|
||||||
|
private PassengerRepository repository;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
entityManager.persist(Passenger.from("Jill", "Smith", 50));
|
||||||
|
entityManager.persist(Passenger.from("Eve", "Jackson", 95));
|
||||||
|
entityManager.persist(Passenger.from("Fred", "Bloggs", 22));
|
||||||
|
entityManager.persist(Passenger.from("Ricki", "Bobbie", 36));
|
||||||
|
entityManager.persist(Passenger.from("Siya", "Kolisi", 85));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSeveralPassengersWhenOrderedBySeatNumberLimitedToThenThePassengerInTheFirstFilledSeatIsReturned() {
|
||||||
|
Passenger expected = Passenger.from("Fred", "Bloggs", 22);
|
||||||
|
|
||||||
|
List<Passenger> passengers = repository.findOrderedBySeatNumberLimitedTo(1);
|
||||||
|
|
||||||
|
assertEquals(1, passengers.size());
|
||||||
|
|
||||||
|
Passenger actual = passengers.get(0);
|
||||||
|
assertEquals(actual, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSeveralPassengersWhenFindFirstByOrderBySeatNumberAscThenThePassengerInTheFirstFilledSeatIsReturned() {
|
||||||
|
Passenger expected = Passenger.from("Fred", "Bloggs", 22);
|
||||||
|
|
||||||
|
Passenger actual = repository.findFirstByOrderBySeatNumberAsc();
|
||||||
|
|
||||||
|
assertEquals(actual, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSeveralPassengersWhenFindPageSortedByThenThePassengerInTheFirstFilledSeatIsReturned() {
|
||||||
|
Passenger expected = Passenger.from("Fred", "Bloggs", 22);
|
||||||
|
|
||||||
|
Page<Passenger> page = repository.findAll(PageRequest.of(0, 1, Sort.by(Sort.Direction.ASC, "seatNumber")));
|
||||||
|
|
||||||
|
assertEquals(page.getContent().size(), 1);
|
||||||
|
|
||||||
|
Passenger actual = page.getContent().get(0);
|
||||||
|
assertEquals(expected, actual);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user