使用Hibernate 3.6.3和JPA 2.0创建类型化查询时的AbstractMethodError

m3t*_*man 3 hibernate jpa entitymanager jpa-2.0

我正在将Hibernate和JPA用于一个小项目.

不知何故,当试图获得一个类型化的查询时,

java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.createQuery(Ljava/lang/String;Ljava/lang/Class;)Ljavax/persistence/TypedQuery
Run Code Online (Sandbox Code Playgroud)

被抛出; org.hibernate.ejb.EntityManagerImpl来自hibernate-entitymanager-3.3.2.GA.jar.

抛出上述异常是不行的:

  public Account read(Account entity) {
        EntityManager em = ManagedEntityManagerFactory.getEntityManager();

        String jpql = JPQLGenerator.readAccount();
        TypedQuery<Account> typedQuery =
                em.createQuery(jpql, Account.class);
        typedQuery.setParameter("accountId", entity.getAccountId());
        return typedQuery.getSingleResult();
    }
Run Code Online (Sandbox Code Playgroud)

但是这没关系:

public Account read(Account entity) {
    EntityManager em = ManagedEntityManagerFactory.getEntityManager();

    String jpql = JPQLGenerator.readAccount();

    Query query =
            em.createQuery(jpql);
    query.setParameter("accountId", entity.getAccountId());
    Account account = null;
    Object obj = query.getSingleResult();
    if(obj instanceof Account) {
        account = (Account)obj;
    }
    return account;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*unu 5

你有很多Hibernate和JPA版本.在主题行中,您提到了Hibernate版本3.6.3和JPA版本2.0.根据正文文本EntityManagerImpl是版本3.3.2.GA. 这与版本相关联会导致您的问题.

TypedQuery是在JPA 2.0中引入的,Hibernate自3.5.X起实现了这个规范.现在你有了EntityManager接口

<T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery)
Run Code Online (Sandbox Code Playgroud)

但实际的实现并没有实现这样的方法.这就是你得到AbstractMethodError的原因.你的第二个查询工作正常,因为它使用JPA 1.0构造与其中一个实现(3.3.2.GA.)只使用Hibernate版本3.6.3的实现(或更好甚至从不).