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