在 JPQL 中选择 nvl(max(c.EmployeeId),0)?

J. *_*end 5 java persistence ejbql jpql

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

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

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

Chs*_*y76 1

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

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

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

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