在JPA中使用GROUP BY子句时出现ClassCastException

时间:2014-02-03 08:44:38

标签: java 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子句查询是错误的。

4 个答案:

答案 0 :(得分:1)

Student student = (Student) iterator.next();是问题,因为你实际上并没有拉回整个学生。

  

SELECT student.studentName,SUM(student.studentAge)FROM Student   学生GROUP BY student.studentName

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

  

来自学生

然后手动计算数据。如果你想使用你的原始查询,你必须解析每个单独的值,而不是使用迭代器,让我们说它们在resultList中。

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

答案 1 :(得分:0)

这是因为我确信您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]);

答案 2 :(得分:0)

除非您已将Student类定义为String和一个数字,否则您不会返回Student类,因此您无法将其转换为Student student = (Student) iterator.next(); 类。这一行:

{{1}}

那,你可能还应该定义List和Iterators正在处理的类。

答案 3 :(得分:0)

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

试试这个: 首先在实体内部创建一个构造函数,其中包含两个参数。姓名和年龄。

然后使用此查询:

SELECT NEW com.sample.Student(student.studentName,SUM(student.studentAge))FROM Student student GROUP BY student.studentName;

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