我試圖在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();
}
}
我該如何解決這個問題?
好的。 Spring正在檢查查詢是否是Query的一個實例,並生成該類型的代理。不幸的是,'TypedQuery'是'Query'的一個子類型,生成的代理將只執行'Query'。在JavaEE 6中引入了TypedQuery,因此Spring不處理它是可以理解的,儘管Spring 3 *被認爲能夠正確處理JavaEE 6。絕對是一個錯誤。 – skaffman 2010-01-20 15:12:32
謝謝,夥計。 我創建了issuse: http://jira.springframework.org/browse/SPR-6733 這是我第一次報告bug :) – 2010-01-20 22:36:48
它只是被修復:) – skaffman 2010-01-21 12:06:41