Skip to content

Spring 3.0 ORM with JPA 2.0 TypedQuery ClassCastException [SPR-6733] #11399

@spring-projects-issues

Description

@spring-projects-issues

Ke CAI opened SPR-6733 and commented

see: http://stackoverflow.com/questions/2101500/spring-3-0-orm-with-jpa-2-0-classcastexception/2102328#2102328

I'm trying to use JPA 2.0 in Spring 3.0 ORM. The JPA vendor is Hibernate 3.5.0-Beta-3.

It works well with JPQL, but when I tried to use CriteriaQuery, an exception happens:

java.lang.ClassCastException: $Proxy50 cannot be cast to javax.persistence.TypedQuery at $Proxy38.createQuery(Unknown Source) at com.absorbx.retailx.dao.impl.ShopDaoImpl.findByCrieria(ShopDaoImpl.java:30) at com.absorbx.retailx.dao.SimpleDaoTest.testFindByCriteria(SimpleDaoTest.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

The DAO code:

@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();
}

}

It seems to be a bug in Spring:

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

Good catch. Spring is checking to see if the query is an instance of Query, and generates the proxy of that type. Unfortunately, TypedQuery is a subtype of Query, and the generated proxy will still only implement Query. TypedQuery was introduced in JavaEE 6, so it's understandable why Spring doesn't handle it, although Spring 3 is supposed to handle JavaEE 6 properly. Definitely a bug.


Affects: 3.0 GA

Reference URL: http://stackoverflow.com/questions/2101500/spring-3-0-orm-with-jpa-2-0-classcastexception/2102328#2102328

Issue Links:

Referenced from: commits bcfef8a, 0aee6e9

2 votes, 3 watchers

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions