在 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)?的主要内容,如果未能解决你的问题,请参考以下文章