【问题标题】:How to combine multiple rows into one row in hql?如何在hql中将多行合并为一行?
【发布时间】:2018-11-30 02:18:51
【问题描述】:

就是这样,假设有 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 developer 中对其进行了测试。但是在春天,我很难将它转换为 Result 对象。它给出了 can't not convert to Result 异常。

请帮忙。帮助本机查询或 hql 都可以完成这项工作。提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您可以尝试在最后一个 findResult() 中将返回类型更改为 List(我认为它将是 List&lt;Object[]&gt; 或类似的东西),然后通过 for-loop 将结果转换为 List&lt;Result&gt;

    或者您可以使用SqlResultSetMapping 进行本机查询映射。

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多