Извлечение и фильтрация данных из нескольких JOIN по JPA - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть 3 сущности, которые связаны друг с другом.
Группа

@Entity
@Table(name = "`group`")
public class Group implements Serializable {
    @OneToMany(mappedBy = "group",fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    private List<Student> students;
}

Студент

@Entity
@Table(name = "student")
public class Student implements Serializable {
    @OneToMany(mappedBy = "student",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    private List<Rating> ratings;
}

Рейтинг

@Entity
@Table(name = "rating")
public class Rating implements Serializable {
    @Temporal(TemporalType.DATE)
    @Column
    private Date date;

    @ManyToOne
    @JoinColumn(name = "id_student")
    private Student student;
}

Мне нужно получить группу по идентификатору со всеми учащимися с их рейтингом, который имеет дату между.Я пытаюсь в этих случаях решить проблему

 @Query(value = "select g from Group g INNER JOIN g.students s ON g.id = :id INNER JOIN s.ratings r ON r.student.id = s.id and r.date between :dateStart and :dateEnd GROUP BY g.id")

 @Query(value = "SELECT * FROM Group g INNER JOIN student ON g.id_group = :id RIGHT JOIN rating on student.id_student = rating.id_student and rating.`date` between :dateStart and :dateEnd GROUP BY g.id_group",nativeQuery = true)

 @Query(value = "select g from Group g WHERE g.id = :id and g.students IN (select s from g.students s JOIN s.ratings r where r.date between :dateStart and :dateEnd) GROUP BY g.id")

 @Query(value = "SELECT g from Group g JOIN g.students s ON g.id = :id JOIN s.ratings r on s.id = r.student.id and r.date between :startMonth and :endMonth")

Но ни один из них не фильтрует рейтинги как надо.
Локально с этим запросом все работает

SELECT * from `group` JOIN student ON `group`.id_group = 1 LEFT JOIN rating on student.id_student = rating.id_student and rating.`date` between '2019-02-01' and '2019-02-28';

У всех естьИдея, что не так или как преобразовать локальный запрос в JPQL?

UPD
Чтобы избежать вопросов о дате, я использую ту же логику с датой, чтобы получить все оценки между датами.
Репозиторий

@Query(value = "Select r from Rating r where r.student.id = :studentId and r.stageOfApprove = :stageOfApprove and r.date between :startMonth and :endMonth order by r.paragraph.id asc ")
    List<Rating> findAllRatingsByIdStudentAndStageOfApproveGreaterThan(@Param("studentId") Long studentId, @Param("stageOfApprove") Integer stageOfApprove,
                                                                       @Param("startMonth") Date startMonth, @Param("endMonth") Date endMonth);

Сервис

DateTime currentDate = new DateTime();
DateTime minDays = currentDate.dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
DateTime maxDays = currentDate.dayOfMonth().withMaximumValue().withTimeAtStartOfDay();
ratings = ratingRepository.findAllRatingsByIdStudentAndStageOfApproveGreaterThan(studentId,1,minDays.toDate(),maxDays.toDate());
return ratings;
...