2009-08-01 91 views
2

我使用Oracle数据库10g和的EclipseLink,我需要获得来自所以我创造了这个查询在JPQL中选择nvl(max(c.EmployeeId),0)?

javax.persistence.Query q = 
        em.createQuery("SELECT nvl(MAX(c.myAtt),0) " + 
         "from myTable as c"); 
      return Integer.parseInt(q.getSingleResult().toString()); ` 

但是当表empy(有时可能会得到空)表中的最后插入钥匙 我得到了ILEGAL ARGUMENT EXCEPTION,原因:JPQL异常,详细信息:“在EntityManager中创建查询时发生异常”。我做错了什么?

+0

问题发生在em.createQuery()或q.getSingleResult()吗?你能设置适当的日志级别来查看生成的SQL(Hibernate有这个,不确定有关EclipseLink)吗? – javashlook 2009-08-01 12:24:03

回答

1

复述Apu,“我不知道这是什么问题的一部分来纠正第一” :-)

首先,以这种方式获取最后插入的关键是非常糟糕的事情©很危险,效率低下,而且最重要的是,您的JPA已经为您做了不必要的事情:一旦插入实体,其标识符属性将自动更新以包含其主键。其次,就你的查询而言,“myTable”不是你在JPQL中使用的东西,你需要指定你的实体名称(例如,如果你将“Car”映射为“CAR_TABLE”,你应该使用“Car”,而不是JPQL查询中的“CAR_TABLE”)。最后,JPQL不支持NVL()。它支持(通过Expression.ifNull()排序)EclipseLink Expressions。无论如何,这并不是说你需要这样的场景。

1

与此同时别人可能已经插入Autorizaciones的东西,然后您会收到错误ID

1

您可以使用COALESCE功能的新版本现在支持。它可以用来达到与nvl相同的效果。例如:

select nvl(columna,'1') from table 
select COALESCE(columna,'1') from table