Как объединить несколько строк в одну строку в hql? - PullRequest
0 голосов
/ 30 ноября 2018

Вот случай, допустим, 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 сделает эту работу.Заранее спасибо.

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете попытаться изменить тип возвращаемого значения на List в последнем findResult() (я думаю, это будет List<Object[]> или что-то в этом роде), а затем преобразовать результат в List<Result> с помощью цикла for.

Или вы можете использовать SqlResultSetMapping для собственного сопоставления запросов.

...