Update the repositories to solve the N+1 problem.

main
KKlochko 2 years ago
parent 8bd127ac4d
commit d9d595de8b

@ -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() {
public List<Department> readAll() {
EntityGraph<Department> entityGraph = manager.createEntityGraph(Department.class);
entityGraph.addAttributeNodes("patients");
//entityGraph.addSubgraph("patients")
//.addAttributeNodes("indicators");
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 (ArrayList<Department>) query.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() {
public List<Patient> readAll() {
EntityGraph<Patient> entityGraph = manager.createEntityGraph(Patient.class);
entityGraph.addAttributeNodes("indicators");
TypedQuery<Patient> query = manager.createQuery("SELECT p FROM Patient p", Patient.class);
query.setHint( "javax.persistence.fetchgraph", entityGraph);
return (ArrayList<Patient>) query.getResultList();
return query.getResultList();
}
public boolean update(Patient object) {

Loading…
Cancel
Save