選択した曜日の平均占有量を計算する必要があります(たとえば、すべての金曜日 - 毎分)。 Date/Time機能がないため、この問題のJPQL/Querydslソリューションは見つかりませんでした。だから私はJava Streamsを利用しようとしています。私(簡体字)対象:Javaストリームを使用してJPAリポジトリからフィールドをグループ化して平均化して新しいコレクションに入れる方法
class Occupancy {
private LocalDateTime timeStamp;
private int occupied;
}
私のレポ:
@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を使用することです?すべてのアイデアは非常に役立つでしょう...
ありがとうございます。もちろん、2番目のストリームのソリューションは機能しますが、私は1つのストリームとグループ - >平均を使用して結果をリストに入れようと考えました。私は開発にH2を使用していますが、腐食しています。それはMySQLになります。ヒントありがとうございます。 – Aragornx