我正在使用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子句查询是错误的。
答案 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)