2010-01-20 81 views
5

我試圖在Spring 3.0 ORM中使用JPA 2.0。 JPA供應商是Hibernate 3.5.0-Beta-3。Spring 3.0 ORM與JPA 2.0 ClassCastException

它與JPQL效果很好,但是當我試圖用CriteriaQuery中,發生異常:

java.lang.ClassCastException:$ Proxy50 不能轉換到 javax.persistence.TypedQuery在 $ Proxy38.createQuery在 com.absorbx.retailx.dao.impl.ShopDaoImpl.findByCrieria(ShopDaoImpl.java:30)(來源不明) 在 com.absorbx.retailx.dao.SimpleDaoTest.testFindByCriteria(SimpleDaoTest.java:39 ) at sun.ref lect.NativeMethodAccessorImpl.invoke0(母語 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(未知 源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知 源)

DAO的代碼:

@Repository 
public class ShopDaoImpl implements 
ShopDao { 
    @PersistenceContext 
    transient EntityManager entityManager; 

    @Override 
    public Shop findByCrieria() { 
     CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<Shop> c = cb.createQuery(Shop.class); 
     Root<Shop> shop = c.from(Shop.class); 
     c.select(shop).where(cb.equal(shop.get("name"), "petstore")); 
     TypedQuery<Shop> q = entityManager.createQuery(c); 
     return q.getSingleResult(); 
    } 

} 

我該如何解決這個問題?

回答

4

這似乎是在春天的一個錯誤:

org/springframework/orm/jpa/SharedEntityManagerCreator.java

if (result instanceof Query) { 
    Query query = (Query) result; 
    ... 
    result = Proxy.newProxyInstance(Query.class.getClassLoader(), 
     new Class[] {Query.class}, new DeferredQueryInvocationHandler(query, target)); 
    ... 
} 

這將是最好創建一個問題。

+0

好的。 Spring正在檢查查詢是否是Query的一個實例,並生成該類型的代理。不幸的是,'TypedQuery'是'Query'的一個子類型,生成的代理將只執行'Query'。在JavaEE 6中引入了TypedQuery,因此Spring不處理它是可以理解的,儘管Spring 3 *被認爲能夠正確處理JavaEE 6。絕對是一個錯誤。 – skaffman 2010-01-20 15:12:32

+1

謝謝,夥計。 我創建了issuse: http://jira.springframework.org/browse/SPR-6733 這是我第一次報告bug :) – 2010-01-20 22:36:48

+0

它只是被修復:) – skaffman 2010-01-21 12:06:41