Вот случай, допустим, 3 таблицы, класс, ученик и класс.
Отношение: класс 1: много учеников, много учеников: 1 класс.
Значение: один ученикможет посещать только один класс, один класс может иметь несколько студентов.И у одного ученика может быть только один класс.
Сущности: я просто упрощаю их
Class class{
private int id;
private String name;
private Set<Students> students;
//getter setter
}
Class student{
private int id;
private String name;
private Class class;
private Grade grades
//getter setter
}
Class Grade{
private int id;
private char grade;
private Set<Student> students;
//getter setter
}
У меня также есть класс результатов:
Class Result{
private String name;
private String status;
private String grade;
private long count;
public Result(name,status){ //omit}
public Result(name,grade,count){ //omit}
//getter setter
}
Теперь, чтобы найти числоклассов каждый класс имеет:
class grade count
math A 2
math B 10
science A 2
ans so on
hql, который я использую:
@Query("select new Result(class.name, grade.grade, count(*) as numOfCount) from Class class
left join class.students as student
left join student.grade as grade
group by class.name, grade.grade order by class.name");
public List<Result> findResult(Pagable pagable);
Этот hql будет отображать список результатов объекта, как указано выше, с разбивкой на страницы, и я могу перейти к циклу, чтобы получитькаждый результат.Теперь из соображений отображения я хочу получить что-то вроде этого:
class status
math A,2 | B, 1
science A, 2
Что я должен добавить к вышеупомянутому hql, чтобы получить такой результат?Я должен сделать что-то подобное в hql, я не могу сделать это на Java.Причина из-за нумерации страниц.
Позвольте мне объяснить: если теперь размер страницы равен 2, и мы просто используем вышеупомянутый hql, мы получим:
class grade count
math A 2
math B 10
и в Java мы превращаем его в математику A, 2|B, 1, это покажет только одну строку, но нам нужно 2.
Если hql невозможен, как я могу сделать это в собственном запросе.Я проверил на sql, у него есть listagg.
@Query(value="select name, listagg(status,'|') within group(order by status)
from (select cl.name, gr.grade|| ',' ||count(*) as status from CLASS cl,
Grade gr, Student, st
where cl.classId = st.classId and gr.studentId= st.studentId
group by cl.name, gr.grade order by cl.name
) group by name", nativeQuery=true)
public list<Result> findResult();
Этот родной оракул sql даст желаемый результат, я тестирую его в oracle sql developer.Но весной у меня возникают проблемы с преобразованием его в объект Result.Это не может не преобразовать в Результат исключение.
Пожалуйста, помогите.Либо поможет нативный запрос, либо hql сделает эту работу.Заранее спасибо.