선택한 요일의 평균 점유율을 계산해야합니다 (예 : 모든 금요일 - 매분). Date/Time 기능이 없기 때문에이 문제에 대한 JPQL/Querydsl 솔루션을 찾지 못했습니다. 그래서 Java Streams를 사용하려고합니다. 내 (간체) 목적 :Java 스트림을 사용하여 JPA 저장소에서 필드를 그룹화하고 평균화하고 새 컬렉션에 넣는 방법
class Occupancy {
private LocalDateTime timeStamp;
private int occupied;
}
내 REPO :
@Query("select o from Occupancy o")
public Stream<Occupancy> streamAllOccupancies();
샘플 :
try (Stream<Occupancy> stream = repository.streamAllOccupancies()) {
Function<Occupancy,LocalTime> OccupancyMinutesGrouping = (Occupancy o) -> {
return o.getDateTime().toLocalTime().truncatedTo(ChronoUnit.MINUTES);
};
Map<LocalTime,Double> avgMap = stream
.filter(o -> o.getDateTime().getDayOfWeek() == DayOfWeek.MONDAY) //example
.collect(
Collectors.groupingBy(
OccupancyMinutesGrouping,
Collectors.averagingInt(Occupancy::getOccupied)
)
);
}
의미가 있습니다 -하지만 내 점유율 객체의리스트에 가능한 변화들에게이지도를하다 :
new Occupancy(localTime, averagedOccupancy);
나는 또한 스트림 효율성에 대한 걱정 - 데이터베이스의 모든 레코드를 처리해야합니다. 스트림은 jpa repo에서 어떻게 작동합니까? 첫 번째 SQL은 모든 레코드를 가져온 다음 스트림에서 처리합니다. 또는 모든 레코드에서 순차적으로 처리됩니까? 어쩌면 최고의 솔루션은 스트림의 기본 SQL 쿼리 insted를 사용하는 것입니까? 어떤 아이디어라도 도움이 될 것입니다 ...
답장을 보내 주셔서 감사합니다. 물론 두 번째 스트림의 솔루션이 작동하지만 한 스트림 및 그룹 -> 평균을 사용하여 결과를 목록에 넣는 방법을 생각했습니다. 나는 H2를 개발에 사용하고있다. 그러나 자극적이다. 그것은 MySQL이 될 것입니다. 팁 주셔서 감사합니다. – Aragornx