2010-01-20 16 views
5

Estoy tratando de usar JPA 2.0 en Spring 3.0 ORM. El vendedor de JPA es Hibernate 3.5.0-Beta-3.Spring 3.0 ORM con JPA 2.0 ClassCastException

Funciona bien con JPQL, pero cuando traté de usar CriteriaQuery, ocurre una excepción:

java.lang.ClassCastException: $ Proxy50 no se puede convertir a javax.persistence.TypedQuery en $ Proxy38.createQuery (origen desconocido) en com.absorbx.retailx.dao.impl.ShopDaoImpl.findByCrieria (ShopDaoImpl.java:30) en com.absorbx.retailx.dao.SimpleDaoTest.testFindByCriteria (SimpleDaoTest.java:39) en sun.ref lect.NativeMethodAccessorImpl.invoke0 (Nativo Método) en sun.reflect.NativeMethodAccessorImpl.invoke (Desconocido Fuente) en sun.reflect.DelegatingMethodAccessorImpl.invoke (Desconocido Fuente)

El código 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(); 
    } 

} 

¿Cómo resuelvo este problema?

Respuesta

4

parece ser un error en la primavera:

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

Sería mejor crear un problema.

+0

Buena captura. Spring está comprobando si la consulta es una instancia de 'Query' y genera el proxy de ese tipo. Desafortunadamente, 'TypedQuery' es un subtipo de' Query', y el proxy generado solo implementará 'Query'. 'TypedQuery' se introdujo en JavaEE 6, por lo que es comprensible por qué Spring no lo maneja, aunque se supone que Spring 3 * maneja JavaEE 6 correctamente. Definitivamente un error. – skaffman

+1

Gracias, amigo. Creé issuse: http://jira.springframework.org/browse/SPR-6733 Es la primera vez que informo el error :) –

+0

Y simplemente se ha corregido :) – skaffman