在这种情况下,假设有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都可以完成这项工作。预先感谢。
答案 0 :(得分:0)
您可以尝试将return_type更改为最后一个findResult()
中的List(我想它将是List<Object[]>
或类似的东西),然后通过for循环将List<Result>
中的结果转换为
或者您可以将SqlResultSetMapping用于本机查询映射。