有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取类强制转换异常

我只想在JPA中传递sql查询生成器查询,就像

        public List<QueryBuilder[]> getQueryBuilder(String query) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createNativeQuery(query);
            List<QueryBuilder[]> queryBuilderList = (List<QueryBuilder[]>) q.getResultList();
            return queryBuilderList;

        } finally {
            em.close();
        }
    }

问题

SELECT p.*,c.*,e.*,pmh.*,rk.* 
FROM patient p, case1 c, episode e, personal_medical_history pmh, reproductive_history rh 
WHERE c.Clinical_Stage = 'IA2' 
AND c.Patient_Id = p.Patient_Id 
AND e.Case_Id = c.Case_Id 
AND pmh.Patient_Id = p.Patient_Id 
AND rh.Patient_Id = p.Patient_Id 
GROUP BY p.patient_Id

在服务时我会做一些类似的事情

 List<QueryBuilder[]> list = builderJpaController.getQueryBuilder(query);
       for (QueryBuilder[] queryBuilders : list) {
        for (QueryBuilder queryBuilder : queryBuilders) {
            System.out.println("queryBuilder Value "+queryBuilder.getRace());
        }
    }

但是我通过上面的代码得到了类cast异常,请帮助 以下是例外

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.medikm.entity.QueryBuilder;
    at com.medikm.servlet.QueryBuilderServlet.getQueryJson(QueryBuilderServlet.java:76)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

共 (1) 个答案

  1. # 1 楼答案

    问题在于:

    List<QueryBuilder[]> queryBuilderList = (List<QueryBuilder[]>) q.getResultList();
    

    假设q.getResultList()返回的非类型化列表是QueryBuilder[]的列表。实际上它是一个Object[]。然而,这是因为q.getResultList()有一个原始返回类型,所以编译器无法判断这是不安全的

    然后,在使用列表中的元素时,尝试将Object[]强制转换为QueryBuilder[]——这是无法做到的

    查询返回的行元素本身不太可能是QueryBuilder实例——它们更可能是“普通的旧”值,如字符串、数字等

    (我之所以说“非常不可能”,是因为我不熟悉JPA——我只是偏离了我所期望的持久性API的功能)

    你需要重新思考你对自己在这里要做的事情的期望


    请注意,即使Object[]的元素是QueryBuilder的实例,也不能将Superclass[]引用强制转换为Subclass[]引用——数组类型之间没有超类/子类关系

    您需要显式转换每个单独的元素:

    Subclass[] castArray(Superclass[] arr) {
      Subclass[] subclassArr = new Subclass[arr.length];
      for (int i = 0; i < arr.length; ++i) {
        subclassArr[i] = (Subclass) arr[i];
      }
      return subclassArr;
    }