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

Posted

技术标签:

【中文标题】在 JPQL 中选择 nvl(max(c.EmployeeId),0)?【英文标题】:Select nvl(max(c.EmployeeId),0) in JPQL? 【发布时间】:2010-11-15 23:23:52 【问题描述】:

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

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

但是当表格为空时(有时它可能会变空) 我收到非法参数异常,原因:JPQL 异常,详细信息:“在 EntityManager 中创建查询时发生异常”。我做错了什么?

【问题讨论】:

问题出现在 em.createQuery() 还是 q.getSingleResult()?你能设置适当的日志级别来查看生成的 SQL(Hibernate 有这个,不确定 EclipseLink)吗? 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

现在更新版本的 jpql 支持NVL()

【讨论】:

【参考方案4】:

您可以使用COALESCE 函数。可以用来实现和nvl一样的效果。例如:

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

【讨论】:

以上是关于在 JPQL 中选择 nvl(max(c.EmployeeId),0)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nvl() 中使用 to_char

oracle里nvl,to_char,decode这些函数怎么用啊?

如何在 JPQL 中选择随机 10 条记录?

JPQL 选择内部选择

CouchDB:在视图中代表 NVL()

在 JPQL 中可以选择 EXISTS() 吗?