我使用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 你有什么解决方案吗?感谢。
答案 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.NamedQuery
和javax.persistence.NamedQuery
。
不混合两个接口的类型和注释(SessionFactory vs JPA)通常更简单。如果使用SessionFactory,则应该坚持使用特定于Hibernate的类型。