Java 在JPA中使用GROUPBY子句时发生ClassCastException

Java 在JPA中使用GROUPBY子句时发生ClassCastException,java,jpa,Java,Jpa,我在JPA工作。在执行分组子句示例时,它抛出了ClassCastException 下面是我的代码: public class StudentGrouping { public static void main(String[] args) { EntityManager entityManager = EntityManagerUtil.getEmf() .createEntityManager(); try { EntityT

我在JPA工作。在执行分组子句示例时,它抛出了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();
    }

}

}
我的POJO类字段是:

@Column(name = "studentName")
private String studentName;
@Column(name = "studentAge")
private int studentAge;

是我的GROUPBY子句查询错误

这是因为我确信你的
学生
班级看起来不像

  String studentName;
  Integer yyyy;
这就是你要的东西

  student.studentName, SUM(student.studentAge)
我建议您要么创建一个看起来像您的结果的类,要么将结果作为一个对象[]


除非您已将
Student
类定义为
字符串和数字,否则您不会返回
Student
类,因此您无法将其转换为此行中的类型:

Student student = (Student) iterator.next();
您可能还应该定义列表和迭代器正在处理的类的类型是一个问题,因为你实际上并没有把一个学生拉回来

从学生中选择student.studentName和SUM(student.studentAge) 按student.studentName列出的学生组

您的查询正在收回这两个字段。如果要映射到学生对象,必须使用以下命令

来自学生

然后对数据进行手工计算。如果您想使用原始查询,则必须使用解析每个值,而不是使用迭代器(假设它们位于结果列表中)

for (Object[] result : resultList) {
 String studentName = (String) result[0]
 Integer age = (Integer) result[1];
}

问题是您实际上并没有选择学生,而是试图从学生中选择自定义值

试试这个: 首先在实体内部创建一个构造函数,该构造函数有两个参数,即名称和年龄

然后使用此查询:

按Student.studentName从学生组中选择新的com.sample.Student(Student.studentName,SUM(Student.studentAge))


您需要在查询中指定完整的类名(sample:com.sample.Student)

谢谢,您可以使用学生表的名称和年龄告诉我一个group by子句。根据我所做的一些搜索,根据驱动程序
sum
有时作为字符串返回,那么我现在如何分组。非常感谢即使它看起来像那样,你仍然不能把它投给学生即使它看起来像那样,你仍然不能把它投给学生
Student student = (Student) iterator.next();
for (Object[] result : resultList) {
 String studentName = (String) result[0]
 Integer age = (Integer) result[1];
}