diff --git a/src/main/java/ru/serega6531/packmate/controller/PacketController.java b/src/main/java/ru/serega6531/packmate/controller/PacketController.java index 4d9db1b..0192996 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PacketController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PacketController.java @@ -5,13 +5,11 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import ru.serega6531.packmate.model.Stream; +import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.pojo.PacketDto; import ru.serega6531.packmate.service.StreamService; -import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; @RestController @@ -27,14 +25,10 @@ public class PacketController { @PostMapping("/{streamId}") public List getPacketsForStream(@PathVariable long streamId) { - final Optional stream = streamService.find(streamId); - if (stream.isPresent()) { - return stream.get().getPackets().stream() - .map(streamService::packetToDto) - .collect(Collectors.toList()); - } else { - return Collections.emptyList(); - } + List packets = streamService.getPackets(streamId); + return packets.stream() + .map(streamService::packetToDto) + .collect(Collectors.toList()); } } diff --git a/src/main/java/ru/serega6531/packmate/model/Packet.java b/src/main/java/ru/serega6531/packmate/model/Packet.java index 6ed12be..2f168b6 100644 --- a/src/main/java/ru/serega6531/packmate/model/Packet.java +++ b/src/main/java/ru/serega6531/packmate/model/Packet.java @@ -36,7 +36,7 @@ public class Packet { @Transient private int ttl; - @ManyToOne(optional = false) + @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "stream_id", nullable = false) private Stream stream; diff --git a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java index 240ea60..4c7ff2a 100644 --- a/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/StreamRepository.java @@ -6,6 +6,8 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import ru.serega6531.packmate.model.Stream; +import java.util.Optional; + public interface StreamRepository extends JpaRepository, JpaSpecificationExecutor { @Query("UPDATE Stream SET favorite = :favorite WHERE id = :id") @@ -14,4 +16,11 @@ public interface StreamRepository extends JpaRepository, JpaSpecif long deleteByEndTimestampBeforeAndFavoriteIsFalse(long threshold); + @Query("SELECT s FROM Stream s " + + "LEFT JOIN FETCH s.packets AS packets " + + "LEFT JOIN FETCH packets.matches " + + "WHERE s.id = :id" + ) + Optional getStreamWithPackets(long id); + } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 5256dde..6a254a9 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -7,10 +7,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; +import org.springframework.http.HttpStatus; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; import ru.serega6531.packmate.model.*; import ru.serega6531.packmate.model.enums.PatternActionType; import ru.serega6531.packmate.model.enums.PatternDirectionType; @@ -242,8 +244,10 @@ public class StreamService { return saved; } - public Optional find(long id) { - return repository.findById(id); + public List getPackets(long streamId) { + return repository.getStreamWithPackets(streamId) + .map(Stream::getPackets) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); } /**