Arhn - архитектура программирования

Spring boot: JPA неправильно добавляет предложение where

У меня есть три класса сущностей; Student, Subject и StudentSubject.

Student имеет отношение один ко многим к StudentSubject, а Subject также имеет отношение один ко многим к StudentSubject.

Студенческий класс

@Entity
@Getter
@Setter
public class Student {
    @Id
    private String email;

    @OneToMany(mappedBy = "student")
    @JsonManagedReference
    private List<StudentSubject> subjects;
    //more elements
}

Тематический класс

@Entity
@Getter
@Setter
public class Subject {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    @JsonBackReference
    private Teacher teacher;

    @OneToMany(mappedBy = "student")
    @JsonManagedReference
    private List<StudentSubject> students;
    //more elements
}

Класс StudentSubject

@Entity
@IdClass(StudentSubjectId.class)
@Getter
@Setter
public class StudentSubject implements Serializable {

    //Primary keys
    @Id
    @Column(name = "subject_id")
    Long subjectId;
    @Id
    @Column(name = "student_email")
    String studentEmail;

    String uid;

    @ManyToOne
    @JsonBackReference
    @JoinColumn(name = "subject_id", insertable = false, updatable = false)
    private Subject subject;
    @ManyToOne
    @JsonBackReference
    @JoinColumn(name = "student_email", insertable = false, updatable = false)
    private Student student;
}

У меня 3 класса, а не 2, потому что есть атрибуты, характерные для каждой предметной пары ученика. Отсюда такая договоренность.

Когда я читаю тему из репозитория, как таковую

Subject subject = subjectRepository.findByNameAndTeacher(subjectName, teacher);
subject.getStudents();

все детали верны, кроме списка студентов. Он всегда пуст (проверено добавлением точки останова)


Запросы, которые выполняются Hibernate/JPA:

Чтобы получить тему (?)

select
    subject0_.id as id1_3_,
    subject0_.name as name2_3_,
    subject0_.teacher_email as teacher_3_3_ 
from
    subject subject0_ 
    left outer join
        teacher teacher1_ 
        on subject0_.teacher_email = teacher1_.email 
where
    subject0_.name =? 
    and teacher1_.email =?

Чтобы выбрать список студентов (?)

select
    students0_.student_email as student_1_2_0_,
    students0_.subject_id as subject_2_2_0_,
    students0_.student_email as student_1_2_1_,
    students0_.subject_id as subject_2_2_1_,
    students0_.uid as uid3_2_1_,
    subject1_.id as id1_3_2_,
    subject1_.name as name2_3_2_,
    subject1_.teacher_email as teacher_3_3_2_,
    teacher2_.email as email1_5_3_,
    teacher2_.name as name2_5_3_ 
from
    student_subject students0_ 
    left outer join
        subject subject1_ 
        on students0_.subject_id = subject1_.id 
    left outer join
        teacher teacher2_ 
        on subject1_.teacher_email = teacher2_.email 
where
    students0_.student_email =?

и еще кое-что.

Я думаю, что проблема здесь в том, что последнее предложение where добавлено неправильно, и общие атрибуты в таблицах не отображаются ни разу. Как это исправить?


  • вы не указали тип выборки. установите его на Нетерпеливый 11.02.2018

Ответы:


1

В вашем отображении опечатка. В классе Subject это должно быть @OneToMany(mappedBy = "subject") вместо mappedBy="student", следовательно, ваше неправильное предложение where.

По этой причине он использует where students0_.student_email =? вместо where students0_.subject_id =?, так как считает, что путь к ученикам из предмета лежит через столбец student_email, как указано в вашем сопоставлении.

11.02.2018

2

Вы не указали тип выборки. Это должно исправить это.

@OneToMany(mappedBy = "student", fetch = FetchType.EAGER)
@JsonManagedReference
private List<StudentSubject> students;
11.02.2018
  • В том, что все? Как вы упомянули, я добавил fetchtype в предметный класс для студентов, но hibernate по-прежнему использует предложение where. 11.02.2018
  • он извлекает студентов после добавления атрибута выборки? 11.02.2018
  • Нет, это не так. Но без предложения where он работает, когда я пробовал запрос непосредственно в БД. 11.02.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..