繁体   English   中英

在JPA中使用GROUP BY子句时发生ClassCastException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM