Skip to content

Commit edbc683

Browse files
trevorgowingmaibin
authored andcommitted
How to limit query results (eugenp#5616)
* JPA/Hibernate * Spring Data JPA BAEL-2208
1 parent 78dd662 commit edbc683

5 files changed

Lines changed: 187 additions & 0 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.limit;
2+
3+
import java.util.List;
4+
5+
interface CustomPassengerRepository {
6+
7+
List<Passenger> findOrderedBySeatNumberLimitedTo(int limit);
8+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.baeldung.limit;
2+
3+
import javax.persistence.Basic;
4+
import javax.persistence.Column;
5+
import javax.persistence.Entity;
6+
import javax.persistence.GeneratedValue;
7+
import javax.persistence.Id;
8+
import java.util.Objects;
9+
10+
@Entity
11+
class Passenger {
12+
13+
@Id
14+
@GeneratedValue
15+
@Column(nullable = false)
16+
private Long id;
17+
18+
@Basic(optional = false)
19+
@Column(nullable = false)
20+
private String fistName;
21+
22+
@Basic(optional = false)
23+
@Column(nullable = false)
24+
private String lastName;
25+
26+
@Basic(optional = false)
27+
@Column(nullable = false)
28+
private int seatNumber;
29+
30+
private Passenger(String fistName, String lastName, int seatNumber) {
31+
this.fistName = fistName;
32+
this.lastName = lastName;
33+
this.seatNumber = seatNumber;
34+
}
35+
36+
static Passenger from(String firstName, String lastName, int seatNumber) {
37+
return new Passenger(firstName, lastName, seatNumber);
38+
}
39+
40+
@Override
41+
public boolean equals(Object object) {
42+
if (this == object)
43+
return true;
44+
if (object == null || getClass() != object.getClass())
45+
return false;
46+
Passenger passenger = (Passenger) object;
47+
return getSeatNumber() == passenger.getSeatNumber() && Objects.equals(getFistName(), passenger.getFistName())
48+
&& Objects.equals(getLastName(), passenger.getLastName());
49+
}
50+
51+
@Override
52+
public int hashCode() {
53+
return Objects.hash(getFistName(), getLastName(), getSeatNumber());
54+
}
55+
56+
@Override
57+
public String toString() {
58+
final StringBuilder toStringBuilder = new StringBuilder(getClass().getSimpleName());
59+
toStringBuilder.append("{ id=").append(id);
60+
toStringBuilder.append(", fistName='").append(fistName).append('\'');
61+
toStringBuilder.append(", lastName='").append(lastName).append('\'');
62+
toStringBuilder.append(", seatNumber=").append(seatNumber);
63+
toStringBuilder.append('}');
64+
return toStringBuilder.toString();
65+
}
66+
67+
Long getId() {
68+
return id;
69+
}
70+
71+
String getFistName() {
72+
return fistName;
73+
}
74+
75+
String getLastName() {
76+
return lastName;
77+
}
78+
79+
int getSeatNumber() {
80+
return seatNumber;
81+
}
82+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.limit;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
interface PassengerRepository extends JpaRepository<Passenger, Long>, CustomPassengerRepository {
6+
7+
Passenger findFirstByOrderBySeatNumberAsc();
8+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.baeldung.limit;
2+
3+
import org.springframework.stereotype.Repository;
4+
5+
import javax.persistence.EntityManager;
6+
import javax.persistence.PersistenceContext;
7+
import java.util.List;
8+
9+
@Repository
10+
class PassengerRepositoryImpl implements CustomPassengerRepository {
11+
12+
@PersistenceContext
13+
private EntityManager entityManager;
14+
15+
@Override
16+
public List<Passenger> findOrderedBySeatNumberLimitedTo(int limit) {
17+
return entityManager.createQuery("SELECT p FROM Passenger p ORDER BY p.seatNumber",
18+
Passenger.class).setMaxResults(limit).getResultList();
19+
}
20+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.baeldung.limit;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
import org.junit.runner.RunWith;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
8+
import org.springframework.data.domain.Page;
9+
import org.springframework.data.domain.PageRequest;
10+
import org.springframework.data.domain.Sort;
11+
import org.springframework.test.context.junit4.SpringRunner;
12+
13+
import javax.persistence.EntityManager;
14+
import javax.persistence.PersistenceContext;
15+
import java.util.List;
16+
17+
import static org.junit.Assert.assertEquals;
18+
19+
@DataJpaTest
20+
@RunWith(SpringRunner.class)
21+
public class LimitIntegrationTest {
22+
23+
@PersistenceContext
24+
private EntityManager entityManager;
25+
@Autowired
26+
private PassengerRepository repository;
27+
28+
@Before
29+
public void before() {
30+
entityManager.persist(Passenger.from("Jill", "Smith", 50));
31+
entityManager.persist(Passenger.from("Eve", "Jackson", 95));
32+
entityManager.persist(Passenger.from("Fred", "Bloggs", 22));
33+
entityManager.persist(Passenger.from("Ricki", "Bobbie", 36));
34+
entityManager.persist(Passenger.from("Siya", "Kolisi", 85));
35+
}
36+
37+
@Test
38+
public void givenSeveralPassengersWhenOrderedBySeatNumberLimitedToThenThePassengerInTheFirstFilledSeatIsReturned() {
39+
Passenger expected = Passenger.from("Fred", "Bloggs", 22);
40+
41+
List<Passenger> passengers = repository.findOrderedBySeatNumberLimitedTo(1);
42+
43+
assertEquals(1, passengers.size());
44+
45+
Passenger actual = passengers.get(0);
46+
assertEquals(actual, expected);
47+
}
48+
49+
@Test
50+
public void givenSeveralPassengersWhenFindFirstByOrderBySeatNumberAscThenThePassengerInTheFirstFilledSeatIsReturned() {
51+
Passenger expected = Passenger.from("Fred", "Bloggs", 22);
52+
53+
Passenger actual = repository.findFirstByOrderBySeatNumberAsc();
54+
55+
assertEquals(actual, expected);
56+
}
57+
58+
@Test
59+
public void givenSeveralPassengersWhenFindPageSortedByThenThePassengerInTheFirstFilledSeatIsReturned() {
60+
Passenger expected = Passenger.from("Fred", "Bloggs", 22);
61+
62+
Page<Passenger> page = repository.findAll(PageRequest.of(0, 1, Sort.by(Sort.Direction.ASC, "seatNumber")));
63+
64+
assertEquals(page.getContent().size(), 1);
65+
66+
Passenger actual = page.getContent().get(0);
67+
assertEquals(expected, actual);
68+
}
69+
}

0 commit comments

Comments
 (0)