【发布时间】: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