Skip to content

Commit cd871c3

Browse files
committed
Introduced Base class for JPA repositories
1 parent 6d94490 commit cd871c3

File tree

11 files changed

+69
-59
lines changed

11 files changed

+69
-59
lines changed

src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.capgemini.training.appointmentbooking;
22

3+
import com.capgemini.training.appointmentbooking.dataaccess.repository.impl.BaseJpaRepositoryImpl;
34
import org.springframework.boot.SpringApplication;
45
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
57

68
@SpringBootApplication
9+
@EnableJpaRepositories(repositoryBaseClass = BaseJpaRepositoryImpl.class)
710
public class AppointmentBookingAppApplication {
811

912
public static void main(String[] args) {

src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepository.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity;
77
import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity;
88
import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria;
9-
import jakarta.persistence.EntityManager;
109
import jakarta.persistence.criteria.*;
11-
import org.springframework.data.jpa.repository.JpaRepository;
1210
import org.springframework.data.jpa.repository.Query;
1311
import org.springframework.data.repository.query.Param;
1412
import org.springframework.stereotype.Repository;
@@ -21,12 +19,12 @@
2119

2220

2321
@Repository
24-
public interface AppointmentRepository extends JpaRepository<AppointmentEntity, Long> {
22+
public interface AppointmentRepository extends BaseJpaRepository<AppointmentEntity, Long> {
2523

26-
default List<AppointmentEntity> findByCriteria(AppointmentCriteria appointmentCriteria, EntityManager entityManager) {
24+
default List<AppointmentEntity> findByCriteria(AppointmentCriteria appointmentCriteria) {
2725
Objects.requireNonNull(appointmentCriteria, "appointmentCriteria must not be null");
2826

29-
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
27+
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
3028
CriteriaQuery<AppointmentEntity> cq = cb.createQuery(AppointmentEntity.class);
3129
Root<AppointmentEntity> root = cq.from(AppointmentEntity.class);
3230
List<Predicate> predicates = new ArrayList<>();
@@ -40,14 +38,11 @@ default List<AppointmentEntity> findByCriteria(AppointmentCriteria appointmentCr
4038
});
4139

4240
Optional.ofNullable(appointmentCriteria.startDate())
43-
.ifPresent(startDate -> {
44-
predicates.add(cb.greaterThanOrEqualTo(root.get("dateTime"), startDate));
45-
});
41+
.ifPresent(startDate -> predicates.add(cb.greaterThanOrEqualTo(root.get("dateTime"), startDate))
42+
);
4643

4744
Optional.ofNullable(appointmentCriteria.endDate())
48-
.ifPresent(endDate -> {
49-
predicates.add(cb.lessThanOrEqualTo(root.get("dateTime"), endDate));
50-
});
45+
.ifPresent(endDate -> predicates.add(cb.lessThanOrEqualTo(root.get("dateTime"), endDate)));
5146

5247
Optional.ofNullable(appointmentCriteria.status())
5348
.ifPresent(status -> predicates.add(cb.equal(root.get("status"), status)));
@@ -66,7 +61,7 @@ default List<AppointmentEntity> findByCriteria(AppointmentCriteria appointmentCr
6661
});
6762

6863
cq.where(predicates.toArray(new Predicate[0]));
69-
return entityManager.createQuery(cq).getResultList();
64+
return getEntityManager().createQuery(cq).getResultList();
7065
}
7166

7267
List<AppointmentEntity> findByDateTimeBetweenAndStatus(Instant start, Instant end, AppointmentStatus status);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.capgemini.training.appointmentbooking.dataaccess.repository;
2+
3+
import jakarta.persistence.EntityManager;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation;
6+
import org.springframework.data.repository.NoRepositoryBean;
7+
8+
@NoRepositoryBean
9+
public interface BaseJpaRepository<T, ID> extends JpaRepositoryImplementation<T, ID> {
10+
EntityManager getEntityManager();
11+
}

src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepository.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
import java.util.List;
1212

1313
@Repository
14-
public interface ClientRepository extends JpaRepository<ClientEntity, Long> {
14+
public interface ClientRepository extends BaseJpaRepository<ClientEntity, Long> {
1515

16-
default List<ClientEntity> findByName(String firstName, String lastName, EntityManager entityManager) {
17-
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
16+
default List<ClientEntity> findByName(String firstName, String lastName) {
17+
JPAQueryFactory queryFactory = new JPAQueryFactory(getEntityManager());
1818

1919
QClientEntity client = QClientEntity.clientEntity;
2020
QUserEntity user = QUserEntity.userEntity;
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package com.capgemini.training.appointmentbooking.dataaccess.repository;
22

33
import com.capgemini.training.appointmentbooking.common.datatype.Specialization;
4-
import com.capgemini.training.appointmentbooking.dataaccess.entity.*;
4+
import com.capgemini.training.appointmentbooking.dataaccess.entity.QSpecialistEntity;
5+
import com.capgemini.training.appointmentbooking.dataaccess.entity.QUserEntity;
6+
import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity;
57
import com.querydsl.jpa.impl.JPAQueryFactory;
6-
import jakarta.persistence.EntityManager;
7-
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
89
import org.springframework.stereotype.Repository;
910

1011
import java.util.List;
1112

1213
@Repository
13-
public interface SpecialistRepository extends JpaRepository<SpecialistEntity, Long> {
14+
public interface SpecialistRepository extends BaseJpaRepository<SpecialistEntity, Long>, QuerydslPredicateExecutor<SpecialistEntity> {
1415

1516
List<SpecialistEntity> findBySpecialization(Specialization specialization);
1617

17-
default List<SpecialistEntity> findSpecialistByName(String firstName, String lastName, EntityManager entityManager) {
18-
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
18+
default List<SpecialistEntity> findSpecialistByName(String firstName, String lastName) {
19+
JPAQueryFactory queryFactory = new JPAQueryFactory(getEntityManager());
1920

2021
QSpecialistEntity specialist = QSpecialistEntity.specialistEntity;
2122
QUserEntity user = QUserEntity.userEntity;
@@ -26,5 +27,6 @@ default List<SpecialistEntity> findSpecialistByName(String firstName, String las
2627
.where(user.firstname.eq(firstName)
2728
.and(user.lastname.eq(lastName)))
2829
.fetch();
30+
2931
}
3032
}

src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepository.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,25 @@
77
import com.querydsl.core.types.dsl.BooleanExpression;
88
import com.querydsl.jpa.impl.JPAQuery;
99
import jakarta.persistence.EntityManager;
10-
import org.springframework.data.jpa.repository.JpaRepository;
1110
import org.springframework.stereotype.Repository;
1211

1312
import java.util.List;
1413
import java.util.Objects;
1514

1615
@Repository
17-
public interface TreatmentRepository extends JpaRepository<TreatmentEntity, Long> {
16+
public interface TreatmentRepository extends BaseJpaRepository<TreatmentEntity, Long> {
1817

1918
List<TreatmentEntity> findAllByName(String name);
2019

2120
List<TreatmentEntity> findByNameNamedQuery(String name);
2221

23-
default List<TreatmentEntity> findByCriteria(TreatmentCriteria treatmentCriteria, EntityManager entityManager) {
22+
default List<TreatmentEntity> findByCriteria(TreatmentCriteria treatmentCriteria) {
2423
Objects.requireNonNull(treatmentCriteria, "treatmentCriteria cannot be null");
2524

2625
QTreatmentEntity treatment = QTreatmentEntity.treatmentEntity;
2726
QSpecialistEntity specialist = QSpecialistEntity.specialistEntity;
2827

29-
JPAQuery<TreatmentEntity> query = new JPAQuery<>(entityManager);
28+
JPAQuery<TreatmentEntity> query = new JPAQuery<>(getEntityManager());
3029
BooleanExpression predicate = treatment.isNotNull();
3130

3231
if (treatmentCriteria.name() != null) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.capgemini.training.appointmentbooking.dataaccess.repository.impl;
2+
3+
import com.capgemini.training.appointmentbooking.dataaccess.repository.BaseJpaRepository;
4+
import jakarta.persistence.EntityManager;
5+
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
6+
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
7+
import org.springframework.stereotype.Repository;
8+
9+
public class BaseJpaRepositoryImpl <T, ID> extends SimpleJpaRepository<T, ID> implements BaseJpaRepository<T, ID> {
10+
11+
private final EntityManager entityManager;
12+
13+
BaseJpaRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
14+
super(entityInformation, entityManager);
15+
this.entityManager = entityManager;
16+
}
17+
18+
@Override
19+
public EntityManager getEntityManager(){
20+
return this.entityManager;
21+
}
22+
}

src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTest.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,11 @@
77
import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity;
88
import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity;
99
import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria;
10-
import jakarta.persistence.EntityManager;
11-
import jakarta.persistence.PersistenceContext;
1210
import org.junit.jupiter.api.Test;
1311
import org.springframework.beans.factory.annotation.Autowired;
1412
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
1513

1614
import java.time.Instant;
17-
import java.time.LocalDateTime;
18-
import java.time.ZoneId;
19-
import java.time.format.DateTimeFormatter;
2015
import java.util.List;
2116
import java.util.Optional;
2217

@@ -26,8 +21,6 @@ public class AppointmentRepositoryTest extends BaseTest {
2621
@Autowired
2722
private AppointmentRepository appointmentRepository;
2823

29-
@PersistenceContext
30-
private EntityManager entityManager;
3124

3225
@Test
3326
void shouldFindAll() {
@@ -48,7 +41,7 @@ void shouldFindAppointmentsByTreatmentName() {
4841
.build();
4942

5043
// when
51-
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria, entityManager);
44+
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria);
5245

5346
// then
5447
assertThat(result).hasSize(2);
@@ -64,7 +57,7 @@ void shouldFindAppointmentsByTreatmentNameAndStartDate() {
6457
.build();
6558

6659
// when
67-
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria, entityManager);
60+
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria);
6861

6962
// then
7063
assertThat(result).hasSize(2);
@@ -81,7 +74,7 @@ void shouldFindAppointmentsByTreatmentNameAndBetweenStartDateAndEndDate() {
8174
.build();
8275

8376
// when
84-
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria, entityManager);
77+
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria);
8578

8679
// then
8780
assertThat(result).hasSize(1);
@@ -97,7 +90,7 @@ void shouldFindAppointmentsByTreatmentNameAndAppointmentStatus() {
9790
.build();
9891

9992
// when
100-
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria, entityManager);
93+
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria);
10194

10295
// then
10396
assertThat(result).hasSize(2);
@@ -113,7 +106,7 @@ void shouldFindAppointmentsByClientId() {
113106
.build();
114107

115108
// when
116-
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria, entityManager);
109+
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria);
117110

118111
// then
119112
assertThat(result).hasSize(5);
@@ -130,7 +123,7 @@ void shouldFindAppointmentsBySpecialistId() {
130123
.build();
131124

132125
// when
133-
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria, entityManager);
126+
List<AppointmentEntity> result = appointmentRepository.findByCriteria(criteria);
134127

135128
// then
136129
assertThat(result).hasSize(4);

src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import com.capgemini.training.appointmentbooking.common.BaseTest;
44
import com.capgemini.training.appointmentbooking.dataaccess.entity.ClientEntity;
5-
import jakarta.persistence.EntityManager;
6-
import jakarta.persistence.PersistenceContext;
75
import org.junit.jupiter.api.Test;
86
import org.springframework.beans.factory.annotation.Autowired;
97
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@@ -16,17 +14,14 @@ public class ClientRepositoryTest extends BaseTest {
1614
@Autowired
1715
private ClientRepository clientRepository;
1816

19-
@PersistenceContext
20-
private EntityManager entityManager;
21-
2217
@Test
2318
void shouldFindClientsByName() {
2419
// given
2520
String firstName = "Stefan";
2621
String lastName = "Kowalski";
2722

2823
// when
29-
List<ClientEntity> clients = clientRepository.findByName(firstName, lastName, entityManager);
24+
List<ClientEntity> clients = clientRepository.findByName(firstName, lastName);
3025

3126
// then
3227
assertThat(clients)

src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import com.capgemini.training.appointmentbooking.common.BaseTest;
44
import com.capgemini.training.appointmentbooking.common.datatype.Specialization;
55
import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity;
6-
import jakarta.persistence.EntityManager;
7-
import jakarta.persistence.PersistenceContext;
86
import org.junit.jupiter.api.Test;
97
import org.springframework.beans.factory.annotation.Autowired;
108
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@@ -17,9 +15,6 @@ public class SpecialistRepositoryTest extends BaseTest {
1715
@Autowired
1816
private SpecialistRepository specialistRepository;
1917

20-
@PersistenceContext
21-
private EntityManager entityManager;
22-
2318
@Test
2419
void shouldFindSpecialistsBySpecialization() {
2520
// given
@@ -42,7 +37,7 @@ void shouldFindSpecialistsByName() {
4237
String lastName = "Zegula";
4338

4439
// when
45-
List<SpecialistEntity> specialists = specialistRepository.findSpecialistByName(firstName, lastName, entityManager);
40+
List<SpecialistEntity> specialists = specialistRepository.findSpecialistByName(firstName, lastName);
4641

4742
// then
4843
assertThat(specialists)

0 commit comments

Comments
 (0)