Update the repositories to solve the N+1 problem.

This commit is contained in:
2023-11-07 17:25:18 +02:00
parent 8bd127ac4d
commit d9d595de8b
4 changed files with 38 additions and 13 deletions
@@ -3,7 +3,7 @@ package space.kklochko.jpa_hospital_example.db.repositories;
import jakarta.persistence.EntityManager;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Setter
@@ -18,7 +18,7 @@ public abstract class AbstractRepository<T> {
public abstract T read(UUID id);
public abstract ArrayList<T> readAll();
public abstract List<T> readAll();
public abstract boolean update(T object);
@@ -1,13 +1,15 @@
package space.kklochko.jpa_hospital_example.db.repositories;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalInsert;
import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalRemove;
import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalUpdate;
import space.kklochko.jpa_hospital_example.models.Department;
import space.kklochko.jpa_hospital_example.models.Patient;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class DepartmentRepository extends AbstractRepository<Department> {
@@ -25,10 +27,28 @@ public class DepartmentRepository extends AbstractRepository<Department> {
return manager.find(Department.class, id);
}
public ArrayList<Department> readAll() {
TypedQuery<Department> query = manager.createQuery("SELECT d FROM Department d", Department.class);
public List<Department> readAll() {
EntityGraph<Department> entityGraph = manager.createEntityGraph(Department.class);
entityGraph.addAttributeNodes("patients");
//entityGraph.addSubgraph("patients")
//.addAttributeNodes("indicators");
return (ArrayList<Department>) query.getResultList();
TypedQuery<Department> query = manager.createQuery("SELECT d FROM Department d", Department.class);
query.setHint( "javax.persistence.fetchgraph", entityGraph);
List<Department> departments = query.getResultList();
for(Department department : departments) {
EntityGraph<Patient> patientEntityGraph = manager.createEntityGraph(Patient.class);
patientEntityGraph.addAttributeNodes("indicators");
TypedQuery<Patient> patientQuery = manager.createQuery("SELECT p FROM Patient p", Patient.class);
patientQuery.setHint( "javax.persistence.fetchgraph", patientEntityGraph);
department.setPatients(patientQuery.getResultList());
}
return departments;
}
public boolean update(Department object) {
@@ -7,7 +7,7 @@ import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalR
import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalUpdate;
import space.kklochko.jpa_hospital_example.models.Indicator;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class IndicatorRepository extends AbstractRepository<Indicator> {
@@ -25,10 +25,10 @@ public class IndicatorRepository extends AbstractRepository<Indicator> {
return manager.find(Indicator.class, id);
}
public ArrayList<Indicator> readAll() {
public List<Indicator> readAll() {
TypedQuery<Indicator> query = manager.createQuery("SELECT i FROM Indicator i", Indicator.class);
return (ArrayList<Indicator>) query.getResultList();
return query.getResultList();
}
public boolean update(Indicator object) {
@@ -1,5 +1,6 @@
package space.kklochko.jpa_hospital_example.db.repositories;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalInsert;
@@ -7,7 +8,7 @@ import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalR
import space.kklochko.jpa_hospital_example.db.repositories.blocks.TransactionalUpdate;
import space.kklochko.jpa_hospital_example.models.Patient;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class PatientRepository extends AbstractRepository<Patient> {
@@ -25,10 +26,14 @@ public class PatientRepository extends AbstractRepository<Patient> {
return manager.find(Patient.class, id);
}
public ArrayList<Patient> readAll() {
TypedQuery<Patient> query = manager.createQuery("SELECT p FROM Patient p", Patient.class);
public List<Patient> readAll() {
EntityGraph<Patient> entityGraph = manager.createEntityGraph(Patient.class);
entityGraph.addAttributeNodes("indicators");
return (ArrayList<Patient>) query.getResultList();
TypedQuery<Patient> query = manager.createQuery("SELECT p FROM Patient p", Patient.class);
query.setHint( "javax.persistence.fetchgraph", entityGraph);
return query.getResultList();
}
public boolean update(Patient object) {