5

我正在使用 oracle10g 数据库和 eclipselink,我需要从表中获取最后插入的键,所以我创建了这个查询

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

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

4

4 回答 4

2

与此同时,其他人可能在 Autorizaciones 中插入了一些东西,然后你收到了错误的 id

于 2010-05-05T12:06:07.053 回答
2

NVL()现在在较新版本的 jpql 中受支持

于 2012-09-05T21:28:07.890 回答
2

您可以使用该COALESCE功能。它可以用来实现与nvl. 例如:

select nvl(columna,'1') from table
select COALESCE(columna,'1') from table
于 2013-06-28T14:10:00.007 回答
1

解释 Apu,“我不知道该问题的哪一部分首先要纠正”:-)

首先,以这种方式检索最后插入的密钥是一件非常糟糕的事情©这是危险的,低效的,最重要的是,因为你的 JPA 已经为你做了这件事,所以它是不必要的:一旦你插入你的实体,它的标识符属性将自动更新为包含它的主键。

其次,就您的查询而言,“myTable”不是您将在 JPQL 中使用的东西,您需要指定您的实体名称(例如,如果您将“Car”映射到“CAR_TABLE”,您应该使用“Car”代替JPQL 查询中的“CAR_TABLE”)。

最后,NVL()JPQL 不支持。EclipseLink Expressions支持(某种程度上,通过Expression.ifNull())。无论如何,在这种情况下,您并不需要它。

于 2009-08-01T17:45:46.543 回答