2015-12-01 51 views
3

我正在嘗試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

+0

代碼是正確的,這是Tuple的用途。引發你的JPA提供者的一個bug –

回答

0

我想你例子,它工作得很好。在我的GitHub倉庫檢出this test

doInJPA(entityManager -> { 
    CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Tuple> cq = cb.createTupleQuery(); 

    Root<BlogEntityProvider.Post> postRoot = cq.from(BlogEntityProvider.Post.class); 
    Path<Long> idPath = postRoot.get("id"); 
    Path<String> titlePath = postRoot.get("title"); 
    cq.multiselect(idPath, titlePath); 

    List<Tuple> resultList = entityManager.createQuery(cq).getResultList(); 

    for (Tuple tuple : resultList) { 
     Long id = tuple.get(idPath); 
     String title = tuple.get(titlePath); 
    } 
}); 

這是5.0.3.Final。如果4.2.21不適用,請在Hibernate Jira上添加一個問題。

+0

我與5.0.4.FINAL有同樣的問題。將嘗試運行您的測試並回報。你用什麼數據庫進行測試?我在想也許這個問題在我使用的Weblogic/Oracle數據庫設置中。 – dagandlerx

相關問題