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 楼答案
问题在于:
假设
q.getResultList()
返回的非类型化列表是QueryBuilder[]
的列表。实际上它是一个Object[]
。然而,这是因为q.getResultList()
有一个原始返回类型,所以编译器无法判断这是不安全的然后,在使用列表中的元素时,尝试将
Object[]
强制转换为QueryBuilder[]
——这是无法做到的查询返回的行元素本身不太可能是
QueryBuilder
实例——它们更可能是“普通的旧”值,如字符串、数字等(我之所以说“非常不可能”,是因为我不熟悉JPA——我只是偏离了我所期望的持久性API的功能)
你需要重新思考你对自己在这里要做的事情的期望
请注意,即使
Object[]
的元素是QueryBuilder
的实例,也不能将Superclass[]
引用强制转换为Subclass[]
引用——数组类型之间没有超类/子类关系您需要显式转换每个单独的元素: