Spring3.0ORM和JPA2.0ClassCastException

Spring3.0ORM和JPA2.0ClassCastException,spring,jpa,Spring,Jpa,我正在尝试在Spring3.0ORM中使用。JPA供应商是3.5.0-Beta-3 它可以很好地使用,但当我尝试使用CriteriaQuery时,出现了一个异常: java.lang.ClassCastException:$Proxy50 不能投靠 javax.persistence.TypedQuery位于 $Proxy38.createQuery(未知源) 在 com.absorbx.retailx.dao.impl.ShopDaoImpl.findByCrieria(ShopDaoImpl

我正在尝试在Spring3.0ORM中使用。JPA供应商是3.5.0-Beta-3

它可以很好地使用,但当我尝试使用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) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(未知 来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知 (来源)

守则:

@存储库
公共类ShopDaoImpl实现
ShopDao{
@持久上下文
瞬态实体管理器;
@凌驾
公共商店findByCrieria(){
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery c=cb.createQuery(Shop.class);
根车间=c.from(车间类别);
c、 选择(shop.where)(cb.equal(shop.get(“name”),“petstore”);
TypedQuery q=entityManager.createQuery(c);
返回q.getSingleResult();
}
}

如何解决此问题?

这似乎是Spring中的一个bug:

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));
    ...
}

最好创建一个问题。

很好。Spring正在检查查询是否是
query
的实例,并生成该类型的代理。不幸的是,
TypedQuery
Query
的一个子类型,生成的代理仍然只实现
Query
TypedQuery
是在JavaEE6中引入的,因此可以理解为什么Spring不处理它,尽管Spring3应该正确处理JavaEE6。肯定是个虫子,谢谢你,伙计。我创建了问题:这是我第一次报告错误:)
if (result instanceof Query) {
    Query query = (Query) result;
    ...
    result = Proxy.newProxyInstance(Query.class.getClassLoader(), 
        new Class[] {Query.class}, new DeferredQueryInvocationHandler(query, target));
    ...
}