[英]ClassCastException while using GROUP BY clause in JPA
我正在与JPA合作。 在执行GROUP BY子句示例时,将引发ClassCastException。
以下是我的代码:
public class StudentGrouping
{
public static void main(String[] args)
{
EntityManager entityManager = EntityManagerUtil.getEmf()
.createEntityManager();
try {
EntityTransaction entr = entityManager.getTransaction();
entr.begin();
Query query = entityManager
.createQuery("SELECT student.studentName, SUM(student.studentAge) FROM Student student GROUP BY student.studentName");
List<?> list = query.getResultList();
Iterator<?> iterator = list.iterator();
while (iterator.hasNext())
{
System.out.println("entered into loop");
Student student = (Student) iterator.next();
System.out.print("Student Name:"+student.getStudentName());
System.out.print(" Age:"+ student.getStudentAge());
System.out.println();
}
entr.commit();
System.out.println("success");
}
catch (Exception e)
{
e.printStackTrace();
} finally {
entityManager.close();
}
}
}
以下是期望:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.demo.entities.Student
at com.demo.action.StudentGrouping.main(StudentGrouping.java:28)
我的POJO类字段是:
@Column(name = "studentName")
private String studentName;
@Column(name = "studentAge")
private int studentAge;
是我的GROUP BY子句查询错误。
Student student = (Student) iterator.next();
这是问题所在,因为您实际上并没有撤回整个学生。
SELECT student.studentName,SUM(student.studentAge),来自Student Student GROUP BY,student.studentName
您的查询正在拉回这两个字段。 如果要映射到学生对象,则必须使用以下内容。
来自学生
然后手动对数据进行计算。 如果要使用原始查询,则必须使用解析每个单独的值,而不是使用迭代器来说它们在resultList中。
for (Object[] result : resultList) {
String studentName = (String) result[0]
Integer age = (Integer) result[1];
}
这是因为我确定您的Student
班级看起来不像
String studentName;
Integer yyyy;
当您要求时得到的是什么
student.studentName, SUM(student.studentAge)
我建议您要么创建一个看起来像您的结果的类,要么将结果视为Object []
如
Object student[] = (Object[])iterator.next();
System.out.print("Student Name:"+student[0]);
System.out.print("Max Age:"+student[1]);
除非您将Student
类定义为String
和数字,否则您不会返回Student
类,因此无法在此行中将其强制转换为:
Student student = (Student) iterator.next();
这样,您可能还应该定义List和Iterators正在处理的类。
问题是您实际上没有选择学生,而是尝试从学生中选择自定义值。
试试看:首先在实体内部创建一个带有两个参数的构造函数,即。 名字和年龄。
然后使用以下查询:
从学生学生组按student.studentName选择新的com.sample.Student(student.studentName,SUM(student.studentAge));
您需要在查询中指定完整的类名(sample:com.sample.Student)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.