Выберите nvl (max (c.EmployeeId), 0) в JPQL? - PullRequest
4 голосов
/ 01 августа 2009

Я использую базу данных 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 Exception, подробнее: «Исключение произошло при создании запроса в EntityManager» Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 28 июня 2013

Вы можете использовать функцию COALESCE. Может использоваться для достижения того же, что и nvl. Например:

select nvl(columna,'1') from table
select COALESCE(columna,'1') from table
2 голосов
/ 05 мая 2010

Тем временем кто-то еще мог вставить что-то в Autorizaciones, и тогда вы получите неправильный идентификатор

2 голосов
/ 06 сентября 2012

NVL() теперь поддерживается в новых версиях jpql

1 голос
/ 01 августа 2009

Перефразируя ВСУ , "Я не знаю, какую часть этого вопроса исправить первым" :-)

Прежде всего, извлечение последнего вставленного ключа таким способом является ОЧЕНЬ ПЛОХОЙ вещью & copy; Это опасно, неэффективно и, самое главное, не нужно, поскольку ваш JPA уже делает это для вас: как только вы вставите объект, его свойство идентификатора будет автоматически обновляться, чтобы содержать его первичный ключ.

Во-вторых, что касается вашего запроса, «myTable» - это не то, что вы будете использовать в JPQL, вам нужно вместо этого указать имя вашей сущности (например, если вы отображаете «Car» в «CAR_TABLE», вы должны использовать » Car "вместо" CAR_TABLE "в запросах JPQL).

Наконец, NVL() не поддерживается JPQL. Он поддерживается (вроде Expression.ifNull()) EclipseLink Expressions . Во всяком случае, вам не нужно это в таком сценарии.

...