2012-02-24 84 views
1

我得到这个简单的Hibernate查询成立,但它没有返回值,这里是我的代码:Hibernate的简单选择查询不返回任何

 EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("timereg"); 
     EntityManager em = emf.createEntityManager(); 

    int id = em.createQuery("SELECT emp.id FROM Employee as emp WHERE emp.bsn = '398723916'").getFirstResult(); 
    object.getEmployee().setId(id); 
    System.out.println("query returns employee id: " + id); 

愚蠢的事情是ID保持为零,但是当我执行此在PostgreSQL查询它返回37.

我觉得hibernate不喜欢我的方式实现选择查询,没有人知道我的选择查询有什么问题吗?

答案: 没有什么错的选择查询我不得不使用getSingeResult()代替getFirstResult(); 代码更改为:

EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("timereg"); 
     EntityManager em = emf.createEntityManager(); 

    Object ob = em.createQuery("select id from Employee where bsn = '398723917'").getSingleResult(); 

     object.getEmployee().setId(Integer.parseInt(ob.toString())); 
     System.out.println(ob); 

这是我的问题的整体解决方案,但让他值得所有的信用我被Yanflea启发。

+0

也许[这个问题](http://stackoverflow.com/questions/2110809/use-of-entitymanager-createnativequeryquery-foo-class ) 可以帮助。即尝试使用'BigDecimal'而不是'long' – hage 2012-02-24 09:17:06

+0

谢谢,但我已经删除了表并让它以普通整数而不是长(Java)/ bigint(SQL语言)重新生成。因此表中的bigint更改为int,并且employee类中的id也更改为int。 ps。我更新了我的代码 – Ben 2012-02-24 09:48:53

+0

您可以在log4j中打开“Hibernate.SQL”来查看哪个sql被执行? – Firo 2012-02-24 09:59:42

回答

2

您正在使用方法getFirstResult(),它为您提供表中记录的位置。您应该使用getSingleResult()。见http://docs.oracle.com/javaee/6/api/javax/persistence/Query.html

编辑

这就是:

Object ob = em.createQuery("select id from Employee where bsn = '398723917'").getSingleResult(); 
+0

getSingeResult()re变成一个对象不是一个价值。 – Ben 2012-02-24 13:11:56

+0

您必须将其投射到您期望的对象(BigInt或Integer,取决于您的设置)。你是否检查过它,看看它返回了什么对象? – Andre 2012-02-24 13:15:31

+0

在你的其他职位 - 你给你的代码的地方,id为Employee类是一个Long ...所以只需将结果投入Long ... – Yanflea 2012-02-24 13:24:09