获得类强制转换异常

时间:2016-04-18 07:26:42

标签: java sql hibernate jpa

我只想在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());
        }
    }

但是我通过上面的代码获得了类强制转换异常请帮忙 以下是例外

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 个答案:

答案 0 :(得分:0)

有问题的一行是:

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

您假设q.getResultList()返回的无类型列表是QueryBuilder[]的列表。实际上它是Object[]。但是,这会编译,因为q.getResultList()具有原始返回类型,因此编译器无法判断这是不安全的。

然后,在使用列表元素时,您会尝试将Object[]转换为QueryBuilder[] - 这无法完成。

查询返回的行元素本身不可能是QueryBuilder个实例 - 它们更可能是&#34;普通的&#34;价值观,如字符串,数字等。

(我说&#34;非常不可能&#34;因为我不熟悉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;
}