如何在hql中将多行合并为一行?

时间:2018-11-30 02:18:52

标签: hibernate spring-boot spring-data-jpa oracle-sqldeveloper

在这种情况下,假设有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();

此本地oracle sql将提供所需的结果,我在oracle sql开发人员中对其进行了测试。但是在春季,我很难将其转换为Result对象。它给出了无法转换为Result的异常。

请帮助。帮助本机查询或hql都可以完成这项工作。预先感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试将return_type更改为最后一个findResult()中的List(我想它将是List<Object[]>或类似的东西),然后通过for循环将List<Result>中的结果转换为

或者您可以将SqlResultSetMapping用于本机查询映射。