Skip to content

Commit

Permalink
CCMSPUI-379: Abstracted away getEntityClazz method, enabled virtual t…
Browse files Browse the repository at this point in the history
…hreads, and added completable futures on BaseEntityManagerRepository

Signed-off-by: Jamie Briggs <jamie.briggs@digital.justice.gov.uk>
  • Loading branch information
Jamie Briggs committed Feb 20, 2025
1 parent b4cb698 commit e0a4f13
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,28 @@
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.query.QueryUtils;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
public abstract class BaseEntityManagerRepository<T> {

protected final EntityManager entityManager;

public abstract Class<T> getEntityClazz();
private final Class<T> entityClazz;

protected BaseEntityManagerRepository(EntityManager entityManager) {
this.entityManager = entityManager;
this.entityClazz = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass())
.getActualTypeArguments()[0];

}

@Transactional(readOnly = true)
public Page<T> findAll(final Specification<T> specification, final Pageable pageable) {
Expand All @@ -47,8 +53,8 @@ public Page<T> findAll(final Specification<T> specification, final Pageable page

private List<T> getResultList(Specification<T> specification, Pageable pageable,
CriteriaBuilder criteriaBuilder) {
CriteriaQuery<T> mainQuery = criteriaBuilder.createQuery(getEntityClazz());
Root<T> mainQueryRoot = mainQuery.from(getEntityClazz());
CriteriaQuery<T> mainQuery = criteriaBuilder.createQuery(entityClazz);
Root<T> mainQueryRoot = mainQuery.from(entityClazz);
applyWhereClause(mainQuery, specification, criteriaBuilder, mainQueryRoot);
applySortingClause(mainQuery, pageable, criteriaBuilder, mainQueryRoot);

Expand Down Expand Up @@ -78,19 +84,19 @@ private void applySortingClause(CriteriaQuery<T> query, Pageable pageable,

private long getCount(Specification<T> specification, CriteriaBuilder criteriaBuilder) {
CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
Root<T> countRoot = countQuery.from(getEntityClazz());
Root<T> countRoot = countQuery.from(entityClazz);
countQuery.select(criteriaBuilder.count(countRoot.get(getIdPropertyName())));
applyWhereClause(countQuery, specification, criteriaBuilder, countRoot);
return entityManager.createQuery(countQuery).getSingleResult();
}

public String getIdPropertyName() {
return java.util.Arrays.stream(getEntityClazz().getDeclaredFields())
return java.util.Arrays.stream(entityClazz.getDeclaredFields())
.filter(field -> field.isAnnotationPresent(jakarta.persistence.Id.class))
.findFirst()
.map(java.lang.reflect.Field::getName)
.orElseThrow(() -> new RuntimeException(
"No @Id annotation found in class: " + getEntityClazz().getName()));
"No @Id annotation found in class: " + entityClazz.getName()));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,4 @@ public CaseSearchRepository(EntityManager entityManager) {
super(entityManager);
}


@Override
public Class<CaseSearch> getEntityClazz() {
return CaseSearch.class;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,4 @@ public ClientDetailRepository(EntityManager entityManager) {
super(entityManager);
}

@Override
public Class<ClientDetail> getEntityClazz() {
return ClientDetail.class;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,4 @@ public NotificationSearchRepository(EntityManager entityManager) {
super(entityManager);
}

@Override
public Class<NotificationInfo> getEntityClazz() {
return NotificationInfo.class;
}
}
2 changes: 2 additions & 0 deletions data-service/src/main/resources/application-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ spring:
driver-class-name: oracle.jdbc.OracleDriver
username: XXCCMS_PUI
password: XXCCMS_PUI
hikari:
maximum-pool-size: 20 # Default is 10

jpa:
database-platform: org.hibernate.dialect.OracleDialect
Expand Down
3 changes: 3 additions & 0 deletions data-service/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ spring:
database-platform: org.hibernate.dialect.OracleDialect
hibernate:
ddl-auto: none
threads:
virtual:
enabled: true

laa.ccms.springboot.starter.auth:
authentication-header: "Authorization"
Expand Down

0 comments on commit e0a4f13

Please sign in to comment.