У меня две таблицы Учитель и Ученик
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 было временным.
Я имею в виду, что вам не нужно выполнять два запроса, то есть сначала запрос для получения списка учителей, а затем прохождение каждого учителя_id, чтобы получить no_of_students. Я использую в моделях NamedQuery. Итак, в какой модели должен находиться этот запрос?
Нет необходимости в двух запросах, вы можете просто использовать:
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())
что вы имели в виду под
but how do I make this work on hibernate