簡體   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