我正在嘗試Criteria API,並且正面臨元組的一個奇怪問題。Hibernate和Criteria API返回對象數組而不是Tuple
我建多少類似於這裏所描述的一個查詢: https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html_single/#querycriteria-tuple
但由於某些原因的結果列表實際上是List<Object[]>
,而不是List<Tuple>
,所以我的代碼無法在運行。 我可以很容易地解決問題,並改變列表上的迭代,以便它在運行時工作,但我想了解我在這裏做錯了什麼。
這裏是我的查詢代碼:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<Users> usersRoot = cq.from(Users.class);
Path<String> namePath = usersRoot.get(Users_.fullName);
Path<Integer> employeeIdPath = usersRoot.get(Users_.employeeId);
cq.multiselect(namePath, employeeIdPath);
List<Tuple> resultList = entityManager.createQuery(cq).getResultList();
List<String> names = new ArrayList<>();
for (Tuple tuple : resultList) {
names.add(tuple.get(namePath));
}
此代碼編譯正常,但我得到一個ClassCastException
當我到達for
循環:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javax.persistence.Tuple
調試證實,確實是返回的結果列表包含Object[]
而不是Tuple
,從而違反了API合約。
我休眠Maven依賴:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.21.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.0.4.Final</version>
</dependency>
此代碼部署爲EJB 3.1應用到WebLogic 12.1.3容器,基礎數據庫是Oracle 12
代碼是正確的,這是Tuple的用途。引發你的JPA提供者的一個bug –