JPA множественная выборка с @OrderColumn возвращает множественное нулевое значение - PullRequest
2 голосов
/ 19 марта 2019

Имеют 3 объекта
Группа

@Entity
@Table(name = "`group`")
public class Group implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_group")
    private Long id;

    @OneToMany(mappedBy = "group",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @OrderColumn(name = "id_student")
    private List<Student> students = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name = "id_faculty")
    private Faculty faculty;
     .....getters/setters 
}

Студент

@Entity
@Table(name = "student")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
public class Student implements Serializable {
    @Id
    @Column(name = "id_student")
    private Long id;

    ......

    @OneToMany(mappedBy = "student",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private List<Rating> ratings = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name = "id_okr")
    private OKR okr;

    @ManyToOne
    @JoinColumn(name = "id_group")
    private Group group;
.....getters/setters 
}

Рейтинг

@Entity
@Table(name = "rating")
public class Rating implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_rating")
    private Long id;

    @Temporal(TemporalType.DATE)
    @Column
    private Date date;

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

    @ManyToOne
    @JoinColumn(name = "id_paragraph")
    private Paragraph paragraph;
    .....getters/setters 
}

JPA-запрос

@Query(value = "SELECT g FROM Group g INNER JOIN FETCH g.students s LEFT JOIN FETCH s.ratings r WHERE g.id = :id AND s.group.id = g.id AND (r.student.id = s.id AND r.date BETWEEN :startMonth and :endMonth OR r IS NULL) GROUP BY s.id")
Group findGroupByStudentGroupId(@Param("id") Long id ,@Param("startMonth") Date startMonth, @Param("endMonth") Date endMonth );

У меня есть ученик с идентификатором 8000, и после извлечения запроса список результатов содержит 8001 элементов, которые содержат 8 моих учеников и 7993нулевые значения.Если я удаляю аннотацию @OrderColumn, у меня есть MultiBagException (не может одновременно получать).Если добавить @OrderColumn в рейтинг ассоциации @OneToMany в сущности Student, у меня будут нулевые значения в коллекции Rating и в коллекции Student.Для меня логика @OrderColumn, которая возвращает нулевые значения как самый большой идентификатор в коллекции, кажется очень странной.Есть ли способ как это решить?
Hibernate версия 5.1.0 Final
Spring Data JPA 1.8.2

1 Ответ

0 голосов
/ 19 марта 2019

Поскольку вы пытаетесь выбрать студентов с определенной группой и рейтингами, вы можете получить свой запрос из объекта студента и присоединиться к объекту Рейтинги.Вам не нужно явно добавлять объединение для групповой сущности, поскольку оно уже во многих сопоставлениях со студентом.

Вы можете изменить свой запрос следующим образом:

@Query(value = "SELECT s FROM Student s LEFT JOIN s.ratings r WHERE s.group.id = :id  AND (r.date BETWEEN :startMonth and :endMonth OR r IS NULL) GROUP BY s.id")
List<Student> findGroupByStudentGroupId(@Param("id") Long id ,@Param("startMonth") Date startMonth, @Param("endMonth") Date endMonth );
...