Cześć
Mam taką tabelę w Oracle Express, która zawiera dane o audytach, raportach z nich oraz użytkownikach, którzy się podpisali pod tym raportem. Z jednego audytu może być kilka raportów.
Tabela ma m.in. 3 kolumny - auditId, reportId i userId.
Potrzebuję sprawdzić, czy user o danym id podpisał się pod raportami z audytu X.
Mam repozytorium (Spring Data) mam teraz metodę:
boolean existsByAuditIdAndReportIdAndUserId(Long auditId, Long reportId, String userId);
Problem jest taki, że pobieram np. jeden audyt i ma on np. 10 raportów.
Aby ustawić flagę podpisał/nie podpisał dla listy raportów, to wołam tę metodę w pętli :/
for (var report : reports) {
response.setSigned(existsByAuditIdAndReportIdAndUserId(auditId, report.getId(), userId));
}
Wydaje mi się, że nie powinno się tak walić tyle selectów w pętli.
Ale z tego co wiem, to Spring Data nie pozwoli zwrócić List<Boolean>
Jest jakiś sposób aby zrobić te zapytanie za jednym zamachem?
Mi przychodzi tylko do głowy zwrócić listę id podpisanych raportów, za pomocą jakiegoś takiego zapytania:
@Query(value = "SELECT r.reportId FROM AuditReports r WHERE r.auditId = :auditId AND r.reportId IN :reportIds AND r.userId = :userId")
List<Long> selectAlreadyReadReportIds(@Param("auditId") Long auditId, @Param("reportsId") List<Long> reportsId, @Param("userId") String userId);
i potem dla każdego raportu już w Javie w pętli sprawdzić, czy jego id jest na liście. Wciąż mamy pętlę, ale przynajmniej nie walimy 10 zapytań...