2009-08-01 88 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