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