Связь "многие ко многим" в Spring Hibernate с переходным значением

У меня две таблицы Учитель и Ученик

Teacher(Teacher_id, Teacher_name)
Student(student_id, student_name)
Teacher_Student(id, Teacher_id, Student_id)

У меня также есть соответствующая модель для каждой таблицы, такой как Teacher.java Student.java и TeacherStudent.java.

Я хочу получить набор результатов со списком информации об учителях и no_of_students для каждого учителя. Например:

Teacher_id, Teacher_name, No_of_students

Я не хочу получать список учителей, а затем перебирать каждый учитель_ид и находить количество учеников.

У меня есть SQL-запрос, который делает это в одном запросе, но как мне заставить это работать в спящем режиме. Также я хочу, чтобы значение No_of_Students было временным.

что вы имели в виду под but how do I make this work on hibernate

YCF_L 01.05.2018 20:48

Я имею в виду, что вам не нужно выполнять два запроса, то есть сначала запрос для получения списка учителей, а затем прохождение каждого учителя_id, чтобы получить no_of_students. Я использую в моделях NamedQuery. Итак, в какой модели должен находиться этот запрос?

oneMoreDeveloper 01.05.2018 20:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
152
1

Ответы 1

Нет необходимости в двух запросах, вы можете просто использовать:

Query query = em.createQuery("SELECT t.id, t.name, t.listStudent.size() FROM Teacher");

Это вернет список массива Object, подобного этому:

List<Object[]> result = query.getResultList();

Для получения информации вы можете использовать:

List<Teacher> listTeachers = new ArrayList<>();
for(Object[] info : result){
    listTeachers.add(
       new Teacher(
          (Long) info[0],   // the id
          (String) info[1], // the name
          (Long) info[2]    // the number of students
       )
   );
}

Я предполагаю, что в вашей учительской сущности у вас есть конструктор:

public Teacher(String id, String name, Long nbrStudent){
   this.id = id;
   this.name = name;
   this.nbrStudent = this.listStudent.size();
}

и переменная @Transient:

@Transient
private @Getter @Setter Long nbrStudent;

Или за один шаг:

Query query = em.createQuery(
        "SELECT com.namepackage.Teacher(t.id, t.name, t.listStudent.size()) FROM Teacher"
);
List<Teacher> result = query.getResultList();

Обратите внимание, что я использовал com.namepackage.Teacher(t.id, t.name, t.listStudent.size())

Другие вопросы по теме