在hibernate 4.2.3中使用javax.persistence.Query

时间:2014-04-05 18:33:34

标签: hibernate named-query

我使用hibernate-4.2.3,我将运行我的第一个NamedQuery。我创建如下:
@NamedQuery(name="LoadUserWithEmail",query="select u from User u where email=:email")
之后,我得到了session.createNamedQuery

        SessionFactory sessionFactory=SessionFactoryBuilder.build();
        Session session=sessionFactory.openSession();
        javax.persistence.Query query=  (javax.persistence.Query) session.getNamedQuery("LoadUserWithEmail");
        query.setParameter("email", email);
        User user=  (User) query.getSingleResult();  

但是当我运行此代码时出现以下错误:

Exception in thread "main" java.lang.ClassCastException: org.hibernate.internal.QueryImpl cannot be cast to javax.persistence.Query
at ir.sarresid.persistence.dao.UserDaoImpl.getWithEmail(UserDaoImpl.java:15)
at ir.sarresid.persistence.test.PersonTest.getUser(PersonTest.java:51)
at ir.sarresid.persistence.test.PersonTest.main(PersonTest.java:17) 

我怎么能解决它。我不会使用org.hibernate.Query 你有什么解决方案吗?感谢。

1 个答案:

答案 0 :(得分:1)

看起来您正在将特定于Hibernate的类型和注释与JPA类型和注释混合使用。 SessionFactory和Session是特定于Hibernate的类,session.getNamedQuery()返回一个实现org.hibernate.Query的对象,而不是javax.persistence.Query

另一方面,javax.persistence.Query是一个JPA类,如果使用JPA的EntityManager创建命名查询,将返回{:1}:

javax.persistence.Query query = entityManager.createNamedQuery("LoadUserWithEmail");

另请注意,有org.hibernate.annotations.NamedQueryjavax.persistence.NamedQuery

不混合两个接口的类型和注释(SessionFactory vs JPA)通常更简单。如果使用SessionFactory,则应该坚持使用特定于Hibernate的类型。